根据第一行的固定计数从pandas数据帧中获取行

时间:2017-09-25 05:22:11

标签: python pandas dataframe

这是我的2500行数据框。Dataframe

这是我的数据框的索引

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)

我想分别对所有Volume,Height,Area,OffsetX,OffsetY行进行分组以进行分析。

请进一步了解如何进一步

2 个答案:

答案 0 :(得分:2)

分别对行(或列)进行分组,以便分析正在做的是pandas所指的split-apply-combine

设置示例数据

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)

我将采用假设你想要在括号之前的索引字符串的第一部分进行分组。在这种情况下,我们可以这样做

# split part of split-apply-combine
g = df.groupby(df.index.str.strip().str.split('(', 1).str[0])

现在可以使用它来执行所有正常的操作组

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

或使用agg汇总(我在下面使用stack进行展示)

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

我们可以通过实现lambda而不是使用一系列str访问器函数来加强分组。

g = df.groupby(lambda i: i.strip().split('(', 1)[0])

这不仅更短,而且几乎没有更快。

%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 :(得分:1)

您可以先使用str.extract,然后使用groupby进行一些汇总,例如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

如果您想分别提取所有值并创建3个级别的MultiIndex

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

非常相似的解决方案,如果需要Index中的3列:

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