【问题标题】:How to generate a contingency table with counts using pandas?如何使用熊猫生成带有计数的列联表?
【发布时间】:2018-10-10 18:49:33
【问题描述】:

假设我有这样的数据:

+-------+--------+--------------+--------+--------------+
| index | used_x | clicked_in_x | used_y | clicked_in_y |
+-------+--------+--------------+--------+--------------+
|     1 | True   | False        | True   | True         |
|     2 | False  | False        | True   | False        |
|     3 | True   | True         | False  | False        |
+-------+--------+--------------+--------+--------------+

我想使用 pandas 生成一个列联表,该表显示如下:

+--------+----------------+----------------+
|        | clicked_from_x | clicked_from_y |
+--------+----------------+----------------+
| used_x |             40 |              3 |
| used_y |              2 |             10 |
+--------+----------------+----------------+

实现这一目标的最佳方法是什么?到目前为止,我已经使用crosstab 方法尝试了以下操作:

import numpy as np
import pandas as pd

size = 20

df = pd.DataFrame({
    'used_x': np.random.choice(a=[False, True], size=size),
    'clicked_from_x': np.random.choice(a=[False, True], size=size),
    'used_y':  np.random.choice(a=[False, True], size=size),
    'clicked_from_y':  np.random.choice(a=[False, True], size=size),
})

pd.crosstab([df['used_x'], df['used_y']], [df['clicked_from_x'], df['clicked_from_y']],  margins=False)

产量:

但这很难理解,而不是我希望的表示。有谁知道如何获得我想要的结果,或者使用 pandas 的等效策略?

【问题讨论】:

    标签: pandas crosstab contingency


    【解决方案1】:

    我们将在这里使用全能的dot product 子例程。

    i = df.filter(like='clicked')
    j = df.filter(like='used')
    
    j.astype(int).T.dot(i)
    
            clicked_from_x  clicked_from_y
    used_x               6               5
    used_y               6               6
    

    【讨论】:

    • 谢谢!说明如何添加 1)边距或 2)转换为百分比是否容易/可能?
    • @fraxture 你可以这样做:result = result / result.sum(axis=1),这有帮助吗?
    • @coldspeed 实际上上面的划分给了我一堆NaNs 并将行复制为列..
    • @fraxture 最后一次尝试:result = result / result.sum(axis=1).values
    • 我想知道实际上是否有办法使用 Pandas 的 crosstab 函数来做到这一点......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多