Объединение 2 строк в 1 строку и присвоение ей значения «столбцы»

#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