Подтвердить что ты не робот

Преобразование заголовка строки в столбец для Pandas DataFrame,

Данные, с которыми я должен работать, немного беспорядочны. У него есть имена заголовков внутри своих данных. Как выбрать строку из существующего фрейма pandas и сделать его (переименовать) на заголовок столбца?

Я хочу сделать что-то вроде:

header = df[df['old_header_name1'] == 'new_header_name1']

df.columns = header
4b9b3361

Ответ 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)