#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Я столкнулся со следующей проблемой. У меня есть данные, которые хорошо отформатированы для человеческого глаза, но ужасны для чтения компьютером. Например, они имеют табличный формат, но без разделителей, а их заголовки заключены в слова, что означает, что если они длиннее определенной длины, остальное записывается с новой строки.
column 1 column 2 but column 3
with more text
1.5893001 1.513451 1.198420
1.5893001 1.513451 1.198420
1.5893001 1.513451 1.198420
1.5893001 1.513451 1.198420
etc...
Я хочу, чтобы столбцы во фрейме данных содержали текст, который есть в этом заголовке. Меня уже раздражает тот факт, что мне приходится предварительно обрабатывать данные, вручную преобразуя их в dict.
После загрузки этих данных во фрейм данных первая строка фрейма данных — это метки столбцов, где column2, конечно, читается только частично. Во второй строке первое значение (столбца 1) имеет значение » «, второе — «с большим количеством текста», а третье — NaN.
Я попробовал, df.columns = df.iloc[0] ' ' df.iloc[1]
в результате чего второй столбец имеет правильную метку, а остальные — нет nan
.
Есть ли способ создать условное выражение?
[редактировать] @jezrael за правильное форматирование
{0: {0: 'column 1', 1: '', 2: 1.5893001, 3: 1.5893001}
1: {0: 'column 2', 1: 'with more text', 2: 1.513451, 3: 1.513451}
2: {0: 'column 3', 1: None, 2: 1.198420, 3: 1.198420}}
Комментарии:
1. Что такое
print (df.head().to_dict())
?2. Также, возможно, лучше загрузить некоторый файл с образцами данных в dropbox, gdocs, потому что чтение заголовка зависит от данных… Трудно проверить с помощью копирования из текста
3. @jezrael Я отредактировал свой пост и добавил df.head().to_dict()
4. Если добавить параметр,
header=[0,1]
чтобыread_csv
он работал или ошибка?5. @jezrael Мне пришлось бы записать этот df в файл tmp csv и перечитывать его во фрейме данных. Я сообщу о своих выводах
Ответ №1:
Вы можете заменить неправильные значения на Series.fillna
и удалить пробелы с помощью str.strip
, затем удалить первые 2 строки с помощью iloc
:
df.columns = (df.iloc[0] ' ' df.iloc[1].fillna('')).str.strip()
df = df.iloc[2:].reset_index(drop=True)
print (df)
column 1 column 2 with more text column 3
0 1.5893 1.51345 1.19842
1 1.5893 1.51345 1.19842