Дублирование данных внутри файла .csv с изменением его формата

#python #csv

#python #csv

Вопрос:

У меня есть файл .csv, который выглядит как:

                 X      XB          XC           O       P
  A312      76.55     -           -           -       -  
  B313      175.4   62.28       32.62       8.189   121.2
  J314      176.5   53.34       40.77       8.277   124.6
  L315      177.9   55.29       41.44       8.427   125.5
  T316      174.7   59.47       63.43       8.264   116.1
  ...
  G378      10.2    58.91       40.13       7.646   126.7
  

Как вы можете видеть, разделители являются только пробелами, и не все значения доступны для каждой строки.

Моя цель — получить те же точные данные в следующем формате:

    312 A   X   76.55
   313 B   X   175.4
   313 B   XB  62.28
   313 B   XC  32.62
   ...
   378 G   O   7.646
   378 G   P   126.7
  

До сих пор мне удавалось читать в файле с pandas и изолировать все столбцы:

 import pandas as pd
raw_id = pd.read_csv("myfile.csv", delim_whitespace = True, header = None, skiprows = [0], usecols = [0], index_col = False)

# same lines, different usecols index for each column.

print(raw_id.to_string(index = False, header = False))
  

Это начало, но у меня есть две большие проблемы, для которых я не могу найти решение.

1) Как мне разделить A312, B313 … и повторно выразить их, как указано в вышеупомянутом новом формате, т. Е. 312 A и т.д.?

2) Как мне связать значение каждого столбца с его числовым привязкой, повторяя целые числа до тех пор, пока столбцы отображают значения, и пропуская, когда я нахожу «-«? Я предполагаю, что здесь необходимы некоторые for циклы, но я не смог справиться.

Большое спасибо всем, кто может помочь с этой задачей!

Комментарии:

1. A312 это строка, поэтому вы можете использовать строковые функции — т. Е. нарезку, объединение. Возможно, вам следует использовать module csv вместо pandas и работать с каждой строкой отдельно.

Ответ №1:

Начните с удаления недостающих значений:

 import numpy as np
x = raw_id.replace('-', np.nan).stack().reset_index()
  

Затем разделите имена:

 x = x.join(x['level_0'].str.extract(r'(D)(d )'), lsuffix='_')
  

Наконец, удалите избыточный столбец:

 x.drop('level_0', axis=1, inplace=True)
#   level_1     0_  0    1
#0        X  76.55  A  312
#1        X  175.4  B  313
#2       XB  62.28  B  313
#3       XC  32.62  B  313
#4        O  8.189  B  313
#...
  

Возможно, вы захотите соответствующим образом переименовать столбцы перед сохранением результатов в файл CSV.

Комментарии:

1. Спасибо @DYZ! Очень полезно. На самом деле у меня возникли проблемы с символом косой черты. Я сейчас на компьютере Mac, это что-нибудь меняет?

2. Например, использование косой черты, как я обычно делаю, выдает это сообщение об ошибке: AttributeError: Можно использовать только .str accessor со строковыми значениями, которые используют np.object_ dtype в pandas.

3. По-прежнему выдает кучу ошибок. Мой код прямо сейчас: [ импортировать numpy как np импортировать pandas как pd raw_id = pd.read_csv(«myfile.csv», delim_whitespace = True, заголовок = Нет, пропуски = [0], usecols = [0], index_col = False) x = raw_id.replace(‘-‘, np.nan).stack().reset_index() x = x.join(x[‘ level_0′].str.извлечь(r'(D)( d )’), lsuffix=’_’) x.отбросить(‘level_0’, axis=1, inplace= True) печать(x)] Вы можете определить, что не так?

4. » куча ошибок » не помогает. Пожалуйста, объясните.

5. Ошибка, на которую я ссылаюсь, — это ошибка, упомянутая выше, т.Е.: AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas . Следующее обновление фрагмента кода, который вы аккуратно предоставили, не решило проблему.