Преобразование заголовка строки в столбец для Pandas DataFrame,
Данные, с которыми я должен работать, немного беспорядочны. У него есть имена заголовков внутри своих данных. Как выбрать строку из существующего фрейма pandas и сделать его (переименовать) на заголовок столбца?
Я хочу сделать что-то вроде:
header = df[df['old_header_name1'] == 'new_header_name1']
df.columns = header
Ответы
Ответ 1
In [21]: df = pd.DataFrame([(1,2,3), ('foo','bar','baz'), (4,5,6)])
In [22]: df
Out[22]:
0 1 2
0 1 2 3
1 foo bar baz
2 4 5 6
Установите метки столбцов равными значениям во 2-й строке (местоположение индекса 1):
In [23]: df.columns = df.iloc[1]
Если в индексе есть уникальные метки, вы можете удалить 2-ю строку, используя:
In [24]: df.drop(df.index[1])
Out[24]:
1 foo bar baz
0 1 2 3
2 4 5 6
Если индекс не уникален, вы можете использовать:
In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]:
1 foo bar baz
0 1 2 3
2 4 5 6
Использование df.drop(df.index[1])
удаляет все строки с той же меткой, что и вторая строка. Поскольку неуникальные индексы могут привести к таким препятствиям (или потенциальным ошибкам), как этот, часто лучше позаботиться о том, чтобы индекс был уникальным (даже если Pandas этого не требует).
Ответ 2
Это работает (pandas v'0.19.2 '):
df.rename(columns=df.iloc[0])
Ответ 3
Вы можете указать индекс строки в конструкторах read_csv или read_html через параметр header
который представляет Row number(s) to use as the column names, and the start of the data
строк Row number(s) to use as the column names, and the start of the data
. Преимущество этого заключается в автоматическом отбрасывании всех предыдущих строк, которые предположительно являются ненужными.
import pandas as pd
from io import StringIO
In[1]
csv = '''junk1, junk2, junk3, junk4, junk5
junk1, junk2, junk3, junk4, junk5
35, 40, 25, 19, 33
40, 50, 61, 72, 85
'''
df = pd.read_csv(StringIO(csv), header=2)
print(df)
Out[1]
35 40 25 19 33
0 40 50 61 72 85
Ответ 4
Было бы проще воссоздать фрейм данных. Это также будет интерпретировать типы столбцов с нуля.
headers = df.iloc[0]
new_df = pd.DataFrame(df.values[1:], columns=headers)