我想使用第三列来对熊猫交叉表中的结果进行加权。
例如,以下内容:
import pandas as pd
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'bar'],
'B': [1, 1, 0, 0, 0],
'weight': [2, 3, 4, 5, 6]})
print(pd.crosstab(df.A, df.B))
结果:
B 0 1
A
bar 2 1
foo 1 1
我想要的结果是:
B 0 1
A
bar 11 3
foo 4 2
答案 0 :(得分:3)
您可以使用aggfunc
参数向交叉表提供自定义聚合函数:
pd.crosstab(df.A, df.B, df.weight, aggfunc = sum)
B 0 1
A
bar 11 3
foo 4 2
答案 1 :(得分:1)
这真的是浪费内存,只有在权重可以被解释为频率(即权重是整数)时才有效,但这样做很简单:
df2 = df.iloc[ np.repeat( df.index.values, df.weight ) ]
这只是使用高级/花式索引来按比例扩展行:
A B weight
0 foo 1 2
0 foo 1 2
1 bar 1 3
1 bar 1 3
1 bar 1 3
然后你可以正常运行交叉表:
pd.crosstab(df2.A, df2.B)
B 0 1
A
bar 11 3
foo 4 2
我怀疑有必要编写一个自定义版本的交叉表,以便正确有效地处理权重,因为pandas中很少(如果有的话)函数会自动为你量身定制。虽然并不是那么难,也许其他人会这样做作为答案。
可能scipy或statsmodels有自动方法吗?