Python Pandas Заміна заголовка на верхній рядок


83

На даний момент у мене є фрейм даних, який виглядає так:

           Unnamed: 1    Unnamed: 2   Unnamed: 3  Unnamed: 4
0   Sample Number  Group Number  Sample Name  Group Name
1             1.0           1.0          s_1         g_1
2             2.0           1.0          s_2         g_1
3             3.0           1.0          s_3         g_1
4             4.0           2.0          s_4         g_2

Я шукаю спосіб видалити рядок заголовка і зробити перший рядок новим рядком заголовка, тому новий фрейм даних буде виглядати так:

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

Я пробував речі за лініями, if 'Unnamed' in df.columns:а потім створив фрейм даних без заголовка, df.to_csv(newformat,header=False,index=False)але, здається, нікуди не дійшов .

Відповіді:


152
new_header = df.iloc[0] #grab the first row for the header
df = df[1:] #take the data less the header row
df.columns = new_header #set the header row as the df header

46

Кадр даних можна змінити, просто виконавши

df.columns = df.iloc[0]
df = df[1:]

Тоді

df.to_csv(path, index=False) 

Повинен зробити трюк.


4
Це краща відповідь, оскільки в ньому немає зайвого коду (new_header).
Ad Infinitum

34

Якщо ви хочете однокласний вкладиш, ви можете зробити:

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

3

Відповідь @ostrokach найкраща. Швидше за все, ви хотіли б зберегти це протягом будь-яких посилань на фрейм даних, таким чином, виграли б від inplace = True.
df.rename(columns=df.iloc[0], inplace = True) df.drop([0], inplace = True)


2

Ось простий прийом, який визначає індекси стовпців "на місці". Оскільки set_indexвстановлює індекси рядків на місці, ми можемо зробити те саме для стовпців, транспонуючи фрейм даних, встановлюючи індекс і транспортуючи його назад:

df = df.T.set_index(0).T

Зверніть увагу, що, можливо, вам доведеться змінити 0in, set_index(0)якщо ваші рядки вже мають інший індекс.


2

Ще один вкладиш із використанням заміни Python:

df, df.columns = df[1:] , df.iloc[0]

Це не призведе до скидання індексу

Хоча навпаки не вийде, як очікувалося df.columns, df = df.iloc[0], df[1:]


0

--інший спосіб зробити це


df.columns = df.iloc[0]
df = df.reindex(df.index.drop(0)).reset_index(drop=True)
df.columns.name = None

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

Якщо вам подобається, натисніть стрілку вгору. Дякую


0
header = table_df.iloc[0]
table_df.drop([0], axis =0, inplace=True)
table_df.reset_index(drop=True)
table_df.columns = header
table_df

Будь ласка, додайте пояснення
vsync

0

Найкраща практика та найкращий OneLiner :

df.to_csv(newformat,header=1)

Зверніть увагу на значення заголовка:

Заголовок посилається на номери рядків, які використовуватимуться як назви стовпців. Не помиліться, номер рядка не df, а файл Excel (0 - перший рядок, 1 - другий тощо).

Таким чином, ви отримаєте потрібну назву стовпця, і вам не доведеться писати додаткові коди або створювати нові df.

Добре, що він скидає замінений рядок.


Це просто виводить CSV, хоча це не змінює фрейм даних, так?
AMC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.