这是我的数据框的索引
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行进行分组以进行分析。
请进一步了解如何进一步
答案 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