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

111

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

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

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

df.columns = header
EK
источник

Ответы:

196
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]

Если индекс имеет уникальные метки, вы можете удалить вторую строку, используя:

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 этого не требует).

Unutbu
источник
Большое спасибо за быстрый ответ! Как я могу выбрать строку по значению вместо положения индекса, чтобы сделать ее заголовком? Итак, для вашего примера что-то вроде .. df.columns = df [df [0] == 'foo']
EK
Проблема в том, что значение может иметь более одной строки "foo". Один из способов обойти эту проблему, чтобы явно выбрать первый такой ряд: df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]].
unutbu 01
Я понимаю, почему вы так поступили. В моем случае я знаю, что есть только одна строка со значением «foo». Так что это нормально. Я только что сделал это, думаю, он такой же, как тот, который вы дали мне выше. idx_loc = df [df [0] == 'foo']. index.tolist () [0] df.columns = df.iloc [idx_loc]
EK
64

Это работает (pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])
Закари Уилсон
источник
23
.drop(df.index[0])
Строку
Мне это нравится больше, чем принятый ответ. Мне нравятся короткие односторонние решения.
Хавьер
13

Было бы проще воссоздать фрейм данных. Это также интерпретирует типы столбцов с нуля.

headers = df.iloc[0]
new_df  = pd.DataFrame(df.values[1:], columns=headers)
shahar_m
источник
4

Вы можете указать индекс строки в конструкторах read_csv или read_html через headerпараметр, который представляет 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
    pears, apples, lemons, plums, other
    40, 50, 61, 72, 85
    '''

    df = pd.read_csv(StringIO(csv), header=2)
    print(df)

Out[1]
       pears   apples   lemons   plums   other
    0     40       50       61      72      85
ccpizza
источник