Pandas dataframe mit multiindex column - merge-Ebenen
Ich habe einen dataframe, grouped
mit multiindex Spalten wie folgt:
import pandas as pd
codes = ["one","two","three"];
colours = ["black", "white"];
textures = ["soft", "hard"];
N= 100 # length of the dataframe
df = pd.DataFrame({ 'id' : range(1,N+1),
'weeks_elapsed' : [random.choice(range(1,25)) for i in range(1,N+1)],
'code' : [random.choice(codes) for i in range(1,N+1)],
'colour': [random.choice(colours) for i in range(1,N+1)],
'texture': [random.choice(textures) for i in range(1,N+1)],
'size': [random.randint(1,100) for i in range(1,N+1)],
'scaled_size': [random.randint(100,1000) for i in range(1,N+1)]
}, columns= ['id', 'weeks_elapsed', 'code','colour', 'texture', 'size', 'scaled_size'])
grouped = df.groupby(['code', 'colour']).agg( {'size': [np.sum, np.average, np.size, pd.Series.idxmax],'scaled_size': [np.sum, np.average, np.size, pd.Series.idxmax]}).reset_index()
>> grouped
code colour size scaled_size
sum average size idxmax sum average size idxmax
0 one black 1031 60.647059 17 81 185.153944 10.891408 17 47
1 one white 481 37.000000 13 53 204.139249 15.703019 13 53
2 three black 822 48.352941 17 6 123.269405 7.251141 17 31
3 three white 1614 57.642857 28 50 285.638337 10.201369 28 37
4 two black 523 58.111111 9 85 80.908912 8.989879 9 88
5 two white 669 41.812500 16 78 82.098870 5.131179 16 78
[6 rows x 10 columns]
Wie kann ich reduzieren/zusammenfassen der Spalte index-Ebenen: "Level1|Level2", z.B. size|sum
, scaled_size|sum
. etc? Wenn dies nicht möglich ist, ist es ein Weg, um groupby()
wie ich oben ohne Erstellung von multi-index-Spalten?
- Dies ist nur meine Meinung ,ich fühle mich wie scott ' s ist besser als das akzeptiert man.
Du musst angemeldet sein, um einen Kommentar abzugeben.
konnte man immer Spalten ändern:
0
, dann ist die obige Ausdruck wird ignoriert es hier :b if b else ''
. Stattdessen habe ich verwendetb != ''
, sogrouped.columns = ['%s%s' % (a, '|%s' % b if b != '' else '') for a, b in grouped.columns]
. Dies kann sinnvoll sein, nach der Verwendunggroupby
listet die Spalten mit zahlen beginnend von 0.None
s in diesem, so dass Sie würde tun müssenif (b == 0 or b)
, aber immer noch einen guten Rufif b is not None
sollte die einfache Art, es auszudrücken...Gibt es möglicherweise eine bessere Möglichkeit, mehr pythonic way zu glätten multiindex Spalten.
1. Mit map und join mit string Spaltenüberschriften:
Ausgabe:
2. Verwenden Sie Karte mit format für die Spaltenüberschriften mit numerischen Datentypen.
Ausgabe:
3. List comprehension mit f-string für Pytnon 3.6+:
Ausgabe:
MultiIndex(levels=[[u'col_a', u'col_b', u'col_c'], [7950230.0, 12304568.0]], labels=[[0, 0, 1], [0, 1, 1]], names=[lev, sublev'])
es gibtTypeError: sequence item 1: expected string, float found
set_axis
Methode, die Sie verwenden können:renamed = df.set_axis(['|'.join(c) for c in df.columns], axis='columns', inplace=False)
axis='index'
würde ähnliche Ergebnisse erzielen, entlang multi-indizierter Reihen)df.columns = df.columns.map(lambda tup: '|'.join(map(str, tup)))
funktionieren würdegrouped.columns.map('|'.join).str.strip('|')
, BTW ich denke, das sollte die akzeptierte AntwortBasierend auf Scott Boston Antwort,
kleines update(es wird die Arbeit für 2 oder mehr Ebenen-Spalte):
Danke, Boston!