【问题标题】:Weighting results in pandas crosstab大熊猫交叉表中的加权结果
【发布时间】:2015-07-30 14:35:15
【问题描述】:

我想使用第三列来衡量 pandas 交叉表中的结果。

例如:

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

【问题讨论】:

标签: python pandas scipy crosstab statsmodels


【解决方案1】:

您可以使用aggfunc 参数为交叉表提供自定义聚合函数:

pd.crosstab(df.A, df.B, df.weight, aggfunc = sum)
B     0  1
A         
bar  11  3
foo   4  2

【讨论】:

  • 非常好,比我的回答要好得多,尤其是在您的数据框很大的情况下。
【解决方案2】:

这真的很浪费内存,并且仅在权重可以解释为频率时才有效(即权重是整数),但这样做相当简单:

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 是否有自动执行此操作的方法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多