【发布时间】:2019-12-09 01:04:20
【问题描述】:
请多多包涵,我不确定我能多好地解释这个问题。我有一个数据框df。
df = pd.DataFrame({"var1":["A","B","B","A","B","C","A","C"],"var2":["foo","bar","bar","foo","foo","foo","bar","foo"],
"var3":["apple","apple","peach","plum","pear","peach","plum","pear"],"actual":[13,2,14,6,8,4,12,9],
"expected":[11,4,9,4,12,0,10,14]})
print(df)
var1 var2 var3 actual expected
0 A foo apple 13 11
1 B bar apple 2 4
2 B bar peach 14 9
3 A foo plum 6 4
4 B foo pear 8 12
5 C foo peach 4 0
6 A bar plum 12 10
7 C foo pear 9 14
我的总体目标是通过变量 (var1, var2, var3) 按变量中的唯一类别对每个变量进行分组,并将每个组的实际值和预期值相加。
例如,当我按var1 分组时,我希望得到这样的结果
df1=pd.DataFrame({"var1":["A","B","C"],"actual":[31,24,13],"expected":[25,25,14]})
print(df1)
var1 actual expected
0 A 31 25
1 B 24 25
2 C 13 14
var2这个:
df2=pd.DataFrame({"var2":["foo","bar"],"actual":[40,28],"expected":[41,23]})
print(df2)
var2 actual expected
0 foo 40 41
1 bar 28 23
和var3这个:
df3=pd.DataFrame({"var3":["apple","peach","plum","pear"],"actual":[15,18,18,17],"expected":[15,9,14,26]})
print(df3)
var3 actual expected
0 apple 15 15
1 peach 18 9
2 plum 18 14
3 pear 17 26
创建后,我想对每个 groupby 的每个组的绝对偏差求和(然后对这些求和)。
基本上是这样的。
print(abs(df1["actual"]-df1["expected"]).sum())
print(abs(df2["actual"]-df2["expected"]).sum())
print(abs(df3["actual"]-df3["expected"]).sum())
print(abs(df1["actual"]-df1["expected"]).sum()+abs(df2["actual"]-df2["expected"]).sum()+abs(df3["actual"]-df3["expected"]).sum())
分别给出 8、6、22、36。
我目前的做法是这样的:
variables = ["var1","var2","var3"]
expecteds = []
actuals = []
for var in variables:
expecteds = np.append(expecteds, (df["expected"].groupby(df[var])).sum())
actuals = np.append(actuals, (df["actual"].groupby(df[var])).sum())
print(np.sum(abs(expecteds-actuals)))
给出 36.0.
答案是正确的,但我想知道是否有人看到更快的方法来做到这一点。我不需要中间步骤的输出,所以只要输出 36 就可以完美地工作。
作为参考,在我的电脑上运行这个方法:
16.6 ms ± 959 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
到目前为止,我从来没有在数据帧上使用过 Pandas,以至于我必须注意运行时。
【问题讨论】:
-
如果您按每个组计算,然后对每个组求和,除非您想重复计算重叠(var1/var2/var3 之间存在差异),那么 36 有意义吗?您在原始表上的绝对差异只有 26...
-
@JonClements 这在直觉上没有意义,但对于我正在从事的项目来说,这是查看它的更可取的方式。但是,是的,它确实有很多重叠和重复计算。
标签: python pandas numpy dataframe pandas-groupby