2017-09-25 1 views
1

Hier ist mein Datenrahmen mit 2500 Zeilen. DataframeZeilen aus Pandas Datenrahmen basierend auf festen Zählwerten aus der ersten Zeile holen

Dies ist der Index meiner Datenrahmen

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', length=2500) 

ich gruppieren möchten alle Volumen, Höhe, Fläche, OffsetX, Reihen OffsetY separat für die Analyse.

helfen bitte, wie weiter verfahren ist

Antwort

2

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) 
1

Sie str.extract und dann groupby mit etwas Aggregation verwenden können, beispielsweise mean:

a = 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']) 
df = pd.DataFrame({'a':range(10)}, index=a) 
print (df) 
       a 
Volume(%)1 0 
Height(um)1 1 
Area(%)1  2 
OffsetX(mm)1 3 
OffsetY(mm)1 4 
Volume(%)2 5 
Height(um)2 6 
Area(%)2  7 
OffsetX(mm)2 8 
OffsetY(mm)2 9  

a = df.index.str.extract('(Volume|Height|Area|OffsetX|OffsetY)', expand=False) 
print (a) 
Index(['Volume', 'Height', 'Area', 'OffsetX', 'OffsetY', 'Volume', 'Height', 
     'Area', 'OffsetX', 'OffsetY'], 
     dtype='object') 

df = df.groupby(a).mean() 
print (df) 
      a 
Area  4.5 
Height 3.5 
OffsetX 5.5 
OffsetY 6.5 
Volume 2.5 

Wenn Sie alle Werte separat extrahiert werden sollen und erstellen MultiIndex mit 3 Ebenen:

a = (df.index 
     .to_series() 
     .str.extract('(Volume|Height|Area|OffsetX|OffsetY)(\(.*\))(\d+)', expand=True)) 
print (a) 
        0  1 2 
Volume(%)1  Volume (%) 1 
Height(um)1 Height (um) 1 
Area(%)1  Area (%) 1 
OffsetX(mm)1 OffsetX (mm) 1 
OffsetY(mm)1 OffsetY (mm) 1 
Volume(%)2  Volume (%) 2 
Height(um)2 Height (um) 2 
Area(%)2  Area (%) 2 
OffsetX(mm)2 OffsetX (mm) 2 
OffsetY(mm)2 OffsetY (mm) 2 

df.index = pd.MultiIndex.from_arrays([a[0], a[1], a[2]], names=('a1','b1','c1')) 
print (df) 
       a 
a1  b1 c1 
Volume (%) 1 0 
Height (um) 1 1 
Area (%) 1 2 
OffsetX (mm) 1 3 
OffsetY (mm) 1 4 
Volume (%) 2 5 
Height (um) 2 6 
Area (%) 2 7 
OffsetX (mm) 2 8 
OffsetY (mm) 2 9 

df = df.groupby(level='a1').mean() 
#from 0.20.1+ 
#df = df.groupby('a1').mean() 
print (df) 
      a 
a1   
Area  4.5 
Height 3.5 
OffsetX 5.5 
OffsetY 6.5 
Volume 2.5 

Sehr ähnliche Lösung bei Bedarf 3 Spalten von Index:

a = (df.index 
     .to_series() 
     .str.extract('(Volume|Height|Area|OffsetX|OffsetY)(\(.*\))(\d+)', expand=True)) 
a.columns = ['a1','b1','c1'] 
print (a) 
        a1 b1 c1 
Volume(%)1  Volume (%) 1 
Height(um)1 Height (um) 1 
Area(%)1  Area (%) 1 
OffsetX(mm)1 OffsetX (mm) 1 
OffsetY(mm)1 OffsetY (mm) 1 
Volume(%)2  Volume (%) 2 
Height(um)2 Height (um) 2 
Area(%)2  Area (%) 2 
OffsetX(mm)2 OffsetX (mm) 2 
OffsetY(mm)2 OffsetY (mm) 2 

df = a.join(df) 
print (df) 
        a1 b1 c1 a 
Volume(%)1  Volume (%) 1 0 
Height(um)1 Height (um) 1 1 
Area(%)1  Area (%) 1 2 
OffsetX(mm)1 OffsetX (mm) 1 3 
OffsetY(mm)1 OffsetY (mm) 1 4 
Volume(%)2  Volume (%) 2 5 
Height(um)2 Height (um) 2 6 
Area(%)2  Area (%) 2 7 
OffsetX(mm)2 OffsetX (mm) 2 8 
OffsetY(mm)2 OffsetY (mm) 2 9 

df = df.groupby('a1').mean() 
print (df) 
      a 
a1   
Area  4.5 
Height 3.5 
OffsetX 5.5 
OffsetY 6.5 
Volume 2.5 
Verwandte Themen