webentwicklung-frage-antwort-db.com.de

Zeile in Spaltenüberschrift für Pandas DataFrame,

Die Daten, mit denen ich arbeiten muss, sind etwas chaotisch. Die Daten enthalten Kopfzeilennamen. Wie kann ich eine Zeile aus einem vorhandenen pandas dataframe) auswählen und in eine Spaltenüberschrift umbenennen?

Ich möchte etwas machen wie:

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

df.columns = header
75
E.K.
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

Stellen Sie die Spaltenbeschriftungen so ein, dass sie den Werten in der 2. Zeile (Indexposition 1) entsprechen:

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

Wenn der Index eindeutige Bezeichnungen hat, können Sie die zweite Zeile löschen, indem Sie Folgendes verwenden:

In [24]: df.drop(df.index[1])
Out[24]: 
1 foo bar baz
0   1   2   3
2   4   5   6

Wenn der Index nicht eindeutig ist, können Sie Folgendes verwenden:

In [133]: df.iloc[pd.RangeIndex(len(df)).drop(1)]
Out[133]: 
1 foo bar baz
0   1   2   3
2   4   5   6

Mit df.drop(df.index[1]) werden alle Zeilen mit derselben Bezeichnung wie die zweite Zeile entfernt. Da nicht eindeutige Indizes zu solchen Stolpersteinen (oder potenziellen Fehlern) führen können, ist es oft besser, darauf zu achten, dass der Index eindeutig ist (obwohl Pandas es nicht erfordert)).

141
unutbu

Dies funktioniert (Pandas v'0.19.2 '):

df.rename(columns=df.iloc[0])
36
Zachary Wilson

Es wäre einfacher, den Datenrahmen neu zu erstellen. Dies würde auch die Spaltentypen von Grund auf neu interpretieren.

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

Sie können den Zeilenindex in den Konstruktoren read_csv oder read_html über den Parameter header angeben, der -- Row number(s) to use as the column names, and the start of the data. Dies hat den Vorteil, dass alle vorhergehenden Zeilen, die angeblich Junk sind, automatisch gelöscht werden.

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
3
ccpizza