将计算行添加到pandas DataFrame

时间:2015-06-12 05:28:16

标签: python pandas

我有一些类似下面的数据,我想添加计算行组几何平均值的行。

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

1 个答案:

答案 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)