如何使用 pandas 生成带有计数的意外事件 table?
How to generate a contingency table with counts using pandas?
假设我有这样的数据:
+-------+--------+--------------+--------+--------------+
| 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 生成一个应急事件 table,它显示 table 像:
+--------+----------------+----------------+
| | 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 的等效策略?
我们将在这里使用全能的 dot
产品子例程。
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
假设我有这样的数据:
+-------+--------+--------------+--------+--------------+
| 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 生成一个应急事件 table,它显示 table 像:
+--------+----------------+----------------+
| | 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 的等效策略?
我们将在这里使用全能的 dot
产品子例程。
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