#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
это строка, поэтому вы можете использовать строковые функции — т. Е. нарезку, объединение. Возможно, вам следует использовать modulecsv
вместо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
. Следующее обновление фрагмента кода, который вы аккуратно предоставили, не решило проблему.