Convertir une ligne en en-tête de colonne pour Pandas DataFrame,

Les données avec lesquelles je dois travailler sont un peu désordonnées.. Il a des noms d'en-tête à l'intérieur de ses données. Comment puis-je choisir une ligne à partir d'une base de données pandas existante et la transformer en un en-tête de colonne?

je veux faire quelque chose comme:

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

df.columns = header
45
demandé sur Veedrac 2014-10-01 21:33:44

3 réponses

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

mettez les étiquettes de la colonne à égalité avec les valeurs de la 2e rangée (emplacement de l'index 1):

In [23]: df.columns = df.iloc[1]

Chute de la 2ème ligne:

In [24]: df.reindex(df.index.drop(1))
Out[24]: 
1 foo bar baz
0   1   2   3
2   4   5   6
89
répondu unutbu 2014-10-01 17:42:09

Cela fonctionne (pandas v'0.19.2'):

df.rename(columns=df.iloc[0])
13
répondu Zachary Wilson 2017-03-15 22:56:58

vous pouvez spécifier l'index des lignes dans le read_csv ou read_html constructeurs via header paramètre qui représente Row number(s) to use as the column names, and the start of the data. Ceci a l'avantage de faire tomber automatiquement toutes les lignes précédentes qui sont supposément des cochonneries.

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
1
répondu ccpizza 2018-08-13 12:45:05