Ich habe einen vorhandenen Datenrahmen im folgenden Format (nennen wir ihn df):

               A     B     C     D
0              1     2     1     4
1              3     0     2     2
2              1     5     3     1

Die Spaltennamen wurden aus einer Tabelle mit der folgenden Form extrahiert (nennen wir sie cat_df):

                      current category
broader category
X                     A
Y                     B
Y                     C
Z                     D

Zuerst möchte ich einen übergeordneten Index voranstellen, damit df so aussieht:

               X     Y           Z
               A     B     C     D
0              1     2     1     4
1              3     0     2     2
2              1     5     3     1

Zuletzt möchte ich die Daten durch Summieren über Unterindizes in den Meta-Index einrollen, um einen neuen Datenrahmen wie folgt zu generieren:

               X     Y     Z
0              1     3     4
1              3     2     2
2              1     8     1

Die Verwendung von concat aus dieser Antwort hat mich nahe gebracht. aber es scheint ein sehr manueller Prozess zu sein, bei dem jede Teilmenge ausgewählt wird. Mein wahrer Datensatz hat eine komplexere Zuordnung, daher möchte ich beim Erstellen meines Meta-Index direkt darauf verweisen. Ich denke, sobald ich den Meta-Index festgelegt habe, sollte mich ein einfaches groupby zur Summierung bringen, aber ich bin immer noch beim ersten Schritt festgefahren.

1
Al S 19 Apr. 2018 im 00:49

3 Antworten

Beste Antwort
d = dict(zip(cat_df['current category'], cat_df.index))

cols = pd.MultiIndex.from_arrays([df.columns.map(d.get), df.columns])
df.set_axis(cols, axis=1, inplace=False)

   X  Y     Z
   A  B  C  D
0  1  2  1  4
1  3  0  2  2
2  1  5  3  1

df_new = df.set_axis(cols, axis=1, inplace=False)
df_new.groupby(axis=1, level=0).sum()

   X  Y  Z
0  1  3  4
1  3  2  2
2  1  8  1
3
piRSquared 18 Apr. 2018 im 22:25

IIUC, du kannst es so machen.

df.columns = pd.MultiIndex.from_tuples(cat_df.reset_index()[['broader category','current category']].apply(tuple, axis=1).tolist())

Drucken (df)

Ausgabe:

   X  Y     Z
   A  B  C  D
0  1  2  1  4
1  3  0  2  2
2  1  5  3  1

Summenstufe:

df.sum(level=0, axis=1)

Ausgabe:

   X  Y  Z
0  1  3  4
1  3  2  2
2  1  8  1
2
Scott Boston 18 Apr. 2018 im 22:23

Sie können set_index zum Erstellen des IDX verwenden und dann Ihrem df zuweisen

idx=df1.set_index('category',append=True).index

df.columns=idx

df
Out[1170]:
current   X  Y     Z
category  A  B  C  D
0         1  2  1  4
1         3  0  2  2
2         1  5  3  1

df.sum(axis=1,level=0)
Out[1171]: 
current  X  Y  Z
0        1  3  4
1        3  2  2
2        1  8  1
2
YOBEN_S 18 Apr. 2018 im 23:02