如何计算多因子简单交叉表?及Pandas表交叉求和实现需求
如何用Pandas计算两个因子的交叉表
嘿,我来帮你搞定这个交叉表的需求!首先咱们先理清楚你的场景:你有两张带id和label的表格,想要把它们的标签做交叉统计,得到不同标签组合的结果对吧?
先明确你的数据情况
你给出的两张表是这样的:
表1(df1):
| id | label |
|---|---|
| 1 | 2 |
| 2 | 0 |
| 3 | 1 |
表2(df2):
| id | label |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 0 |
还有你已经写好的初始化代码:
import pandas as pd d = {'col1': [1, 2, 3], 'col2': [2, 0, 1]} df1 = pd.DataFrame(data=d) d = {'col1': [1, 2, 3], 'col2': [1, 1, 0]} df2 = pd.DataFrame(data=d)
实现步骤
其实搞定这个很简单,分两步走就行:
1. 先把两张表按id合并
因为咱们需要把同一个id对应的两个标签配对起来,所以用pd.merge()把它们合并,给两个col2(也就是label)加个后缀区分开:
merged_df = pd.merge(df1, df2, on='col1', suffixes=('_df1', '_df2'))
合并后的结果会是这样的:
| col1 | col2_df1 | col2_df2 |
|---|---|---|
| 1 | 2 | 1 |
| 2 | 0 | 1 |
| 3 | 1 | 0 |
2. 生成交叉表
用Pandas自带的pd.crosstab()函数直接统计两个标签的组合次数,这就是咱们要的交叉表啦:
cross_table = pd.crosstab(merged_df['col2_df1'], merged_df['col2_df2']) print(cross_table)
运行后输出的结果就是:
col2_df2 0 1 col2_df1 0 0 1 1 1 0 2 0 1
额外扩展:如果需要求和而非计数
要是你不是要统计组合出现的次数,而是要对某个数值字段做交叉求和,那可以给pd.crosstab()加两个参数:values指定要求和的列,aggfunc='sum'指定聚合方式。比如假设合并后的表有个value列:
# 示例:对value列交叉求和 cross_table_sum = pd.crosstab(merged_df['col2_df1'], merged_df['col2_df2'], values=merged_df['value'], aggfunc='sum')
小说明
你给出的目标表数值看起来和当前示例数据不太匹配,可能是示例笔误?不过上面的方法是Pandas生成交叉表的标准做法,完全可以满足你“两个因子交叉统计”的需求~
内容的提问来源于stack exchange,提问作者Thaise
相关产品推荐
相关产品推荐

