Les données sur lesquelles je dois travailler sont un peu en désordre. Il contient des noms d'en-tête à l'intérieur de ses données. Comment puis-je choisir une ligne à partir d'un _frame de données pandas existant et lui donner (le renommer) un en-tête de colonne?
Je veux faire quelque chose comme:
header = df[df['old_header_name1'] == 'new_header_name1']
df.columns = header
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
Définissez les étiquettes de colonne sur les valeurs de la deuxième ligne (emplacement d'index 1):
In [23]: df.columns = df.iloc[1]
Si l'index a des étiquettes uniques, vous pouvez supprimer la deuxième ligne en utilisant:
In [24]: df.drop(df.index[1])
Out[24]:
1 foo bar baz
0 1 2 3
2 4 5 6
Si l'index n'est pas unique, vous pouvez utiliser:
In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]:
1 foo bar baz
0 1 2 3
2 4 5 6
L'utilisation de df.drop(df.index[1])
supprime tous les lignes portant le même libellé que la deuxième ligne. Parce que des index non uniques peuvent conduire à de tels problèmes (ou bogues potentiels), il est souvent préférable de veiller à ce que l'index soit unique (même si Pandas ne l'exige pas).
Cela fonctionne (pandas v'0.19.2 '):
df.rename(columns=df.iloc[0])
Il serait plus facile de recréer le cadre de données. Cela interpréterait également les types de colonnes à partir de zéro.
headers = df.iloc[0]
new_df = pd.DataFrame(df.values[1:], columns=headers)
Vous pouvez spécifier l'index de ligne dans les constructeurs read_csv ou read_html via le paramètre header
qui représente - Row number(s) to use as the column names, and the start of the data
. Cela a l'avantage de supprimer automatiquement toutes les lignes précédentes qui sont supposées être indésirables.
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