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


111

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

Я хочу зробити щось на кшталт:

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

df.columns = header

Відповіді:


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

Встановіть мітки стовпців на рівні значень у другому ряду (розташування індексу 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 цього не вимагає).


Дуже дякую за швидку відповідь! Як я можу вибрати рядок за значенням замість місця розташування індексу, щоб зробити його заголовком? Тож для вашого прикладу щось на кшталт .. df.column = df [df [0] == 'foo']
EK

Проблема в тому, що там може бути більше одного ряду, який має значення "foo". Один з способів обійти цю проблему, щоб явно вибрати перший такий ряд: df.columns = df.iloc[np.where(df[0] == 'foo')[0][0]].
unutbu

Ах, я бачу, чому ти так зробив У моєму випадку я знаю, що існує лише один рядок, який має значення "foo". Так це нормально. Я щойно зробив це так, я думаю, це те саме, що і те, що ви мені дали вище. idx_loc = df [df [0] == 'foo']. index.tolist () [0] df.column = df.iloc [idx_loc]
EK

63

Це працює (pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])

22
Ви можете видалити рядок "заголовка", додавши.drop(df.index[0])
ostrokach

Мені це подобається краще, ніж фактично прийнята відповідь. Я люблю короткі однолінійні рішення.
Хав'єр

13

Простіше було б відтворити кадр даних. Це також інтерпретує типи стовпців з нуля.

headers = df.iloc[0]
new_df  = pd.DataFrame(df.values[1:], columns=headers)

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.