Ich habe einen Datenrahmen mit Datenrahmen verkettet:

df = pd.concat([df1,df2,df3], keys=[df1,df2,df3], names=['frame'])

Und möchten das erste Element einer Spalte aus jedem Frame des großen Frames an eine Liste anhängen.

Ich habe es versucht, indem ich alle Frames in eine Liste eingefügt und das erste Element aus jeder Zeile ausgewählt habe, aber den folgenden Fehler erhalten habe.

Die Indizierung eines MultiIndex mit einem DataFrame-Schlüssel ist nicht implementiert

Edit.: Code, den ich ausprobiert habe

keys = [df1, df2, df3]

d = []
for key in keys:
    d.append(df.loc[key]['col1'][0])
0
Luca R 19 Aug. 2020 im 07:15

2 Antworten

Beste Antwort

Wie wäre es damit

df = pd.concat([df1,df2,df3], keys=['df1', 'df2', 'df3'], names=['frame'])
df.loc[(df.index.levels[0], 0), 'col1'].tolist()
1
AdibP 19 Aug. 2020 im 04:56

Verwenden Sie den Parameter keys von concat, um dem Multiindex eine äußerste Ebene hinzuzufügen und danach zu gruppieren.

df = pd.concat(
    [df1,df2,df3], # list of objects to be concatenated
    keys=['df1', 'df2', 'df3'], # list of strings to construct a new outermost level into the multiindex
    names=['frame'] # name for the new level in the multiindex
    # notice if you pass keys=[('df1', 'a'), ('df1', 'b'), ('df3', 'a')]
    # and names=['real frame', 'variation']
    # then the multiindex will have two new levels
)
first_rows = df.groupby('frame').first()
d = first_rows.col1.to_list()

In einem anderen Zusammenhang sollten Sie vermeiden, mehrere Indizierungen wie in zu verketten

.loc[key]['col1'][0]

Und stattdessen tun

.loc[key, 'col1']

... beachten Sie, dass Ihr Aufruf trotzdem fehlschlägt, da keys eine Liste von Datenrahmen ist, die Sie als Index verwenden möchten

1
RichieV 19 Aug. 2020 im 05:05