Gruppierung Zeilen (oder Spalten) getrennt, um tut zu analysieren, was Pandas bezeichnet als split-apply-combine
Setup-Beispieldaten
import pandas as pd, numpy as np
np.random.seed([3,14159])
idx = pd.Index([
u'Volume(%)1', u'Height(um)1', u' Area(%)1', u'OffsetX(mm)1',
u'OffsetY(mm)1', u'Volume(%)2', u'Height(um)2', u' Area(%)2',
u'OffsetX(mm)2', u'OffsetY(mm)2', u'Volume(%)499', u'Height(um)499',
u' Area(%)499', u'OffsetX(mm)499', u'OffsetY(mm)499', u'Volume(%)500',
u'Height(um)500', u' Area(%)500', u'OffsetX(mm)500', u'OffsetY(mm)500'],
dtype='object')
df = pd.DataFrame(np.random.rand(20, 6), idx)
Ich werde Nehmen Sie an, Sie möchten, dass Sie vor den Klammern nach dem ersten Teil der Indexzeichenfolge gruppieren möchten. In diesem Fall können wir das
# split part of split-apply-combine
g = df.groupby(df.index.str.strip().str.split('(', 1).str[0])
Dies kann nun verwendet werden alle normalen Gruppe von Operationen
g.mean()
0 1 2 3 4 5
Area 0.570096 0.442108 0.483907 0.369207 0.296919 0.504575
Height 0.717268 0.681560 0.584143 0.707477 0.675091 0.519428
OffsetX 0.382745 0.341273 0.583181 0.581414 0.483730 0.389093
OffsetY 0.544904 0.429652 0.226045 0.458973 0.688739 0.499085
Volume 0.526659 0.404874 0.472162 0.618568 0.255428 0.748262
oder eine Aggregation mit agg
(I stack
unten für die Anzeige verwenden) auszuführen
g.agg(['mean', 'sum', 'max']).stack()
0 1 2 3 4 5
Area mean 0.570096 0.442108 0.483907 0.369207 0.296919 0.504575
sum 2.280386 1.768432 1.935627 1.476826 1.187676 2.018299
max 0.802345 0.699236 0.885809 0.855904 0.533728 0.596097
Height mean 0.717268 0.681560 0.584143 0.707477 0.675091 0.519428
sum 2.869072 2.726240 2.336572 2.829906 2.700365 2.077713
max 0.922273 0.964951 0.951598 0.922242 0.975507 0.892488
OffsetX mean 0.382745 0.341273 0.583181 0.581414 0.483730 0.389093
sum 1.530979 1.365093 2.332724 2.325658 1.934922 1.556371
max 0.933637 0.630542 0.928255 0.944937 0.713851 0.844690
OffsetY mean 0.544904 0.429652 0.226045 0.458973 0.688739 0.499085
sum 2.179618 1.718607 0.904180 1.835893 2.754955 1.996340
max 0.923857 0.765601 0.715871 0.818813 0.802785 0.676706
Volume mean 0.526659 0.404874 0.472162 0.618568 0.255428 0.748262
sum 2.106637 1.619497 1.888647 2.474271 1.021713 2.993047
max 0.665079 0.595963 0.726680 0.948864 0.453699 0.940529
Wir können die Gruppierung schärfen, indem eineUmsetzungim Gegensatz zur Verwendung einer Reihe von str
Accessor-Funktionen.
g = df.groupby(lambda i: i.strip().split('(', 1)[0])
Nicht nur ist dies kürzer, es ist auch schneller, wenn kaum.
%timeit df.groupby(df.index.str.strip().str.split('(', 1).str[0]).agg(['mean', 'sum', 'max'])
%timeit df.groupby(lambda i: i.strip().split('(', 1)[0]).agg(['mean', 'sum', 'max'])
5.7 ms ± 211 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
5.06 ms ± 94.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)