我有一些类似下面的数据,我想添加计算行组几何平均值的行。
F1 F2 F3 Type Val
Y Y Y A 1
Y Y Y B 4
Y Y Y C 7
Y N Y A 3
Y N Y B 2
Y N Y C 5
Y N N A 8
Y N N B 9
Y N N C 3
我想在上面的数据框中添加三行
Y Y Y GeoM 3.04
Y N Y GeoM 3.11
Y N N GeoM 6.00
@Brenbarn和@chthonicdaemon帮助我接近我想要的东西: 来自scipy.stats导入gmean 将pandas导入为pd
data = {'F1': ['Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'],
'F2': ['Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', 'N'],
'F3': ['Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N'],
'Type': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'Val': [1, 4, 7, 3, 2, 5, 8, 9, 3]}
df = pd.DataFrame(data)
gb = df.groupby(['F1','F2','F3'])['Val'].apply(gmean).to_frame()
gb.columns = ['Val']
gb['Type'] = 'GeoM'
gb.reset_index(inplace=True)
df.append(gb, ignore_index=True)
F1 F2 F3 Type Val
0 Y Y Y A 1.000000
1 Y Y Y B 4.000000
2 Y Y Y C 7.000000
3 Y N Y A 3.000000
4 Y N Y B 2.000000
5 Y N Y C 5.000000
6 Y N N A 8.000000
7 Y N N B 9.000000
8 Y N N C 3.000000
9 Y N N GeoM 6.000000
10 Y N Y GeoM 3.107233
11 Y Y Y GeoM 3.036589
答案 0 :(得分:1)
您绝对可以使用groupby
来生成几何平均值:
from scipy.stats import gmean
data = {'F1': ['Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y'],
'F2': ['Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', 'N'],
'F3': ['Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N'],
'Type': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'Val': [1, 4, 7, 3, 2, 5, 8, 9, 3]}
df = pandas.DataFrame(data)
gmeans = df.groupby(['F1', 'F2', 'F3']).agg(lambda x: gmean(list(x)))
但是,我认为您应该避免将这些列添加到原始数据框中。如果您习惯于将计算列添加到Excel中似乎有意义,但您不太可能希望将这些新值与原始数据混合在一起。
如果你真的必须将它们添加为行,你可以按如下方式进行:
gmeans['Type'] = 'GeoM'
newdata = pandas.concat([data, gmeans.reset_index()], axis=0)