基于特定条件对比并统计两个Pandas DataFrame中的企业数据
问题描述
数据集
df1
| company | date | act_call | act_visit | po |
|---|---|---|---|---|
| A | 2022-10-01 | Yes | No | No |
| B | 2022-10-01 | Yes | No | Yes |
| C | 2022-10-01 | No | No | No |
| B | 2022-10-02 | No | Yes | No |
| A | 2022-10-02 | No | Yes | Yes |
df2
| company | date | act_call | act_visit | po |
|---|---|---|---|---|
| D | 2022-11-01 | Yes | No | No |
| B | 2022-11-01 | Yes | No | Yes |
| C | 2022-11-01 | Yes | Yes | No |
| D | 2022-11-02 | No | Yes | No |
| A | 2022-11-02 | No | Yes | Yes |
统计需求
对比两个DataFrame,统计两类符合条件的公司数量:
- 同时存在于两个DataFrame中的公司数量;
- 同时存在于两个DataFrame中,且满足:
df2中至少有一条记录的act_call为'Yes'且act_visit为'Yes'df1中所有记录的po为'No'
尝试过的方法
- 针对第一个条件,使用
pandas.DataFrame.sum()和pandas.DataFrame.count_values()未得到预期结果; - 针对第二个条件,尝试了以下代码,但不确定是否仅统计共同存在的公司:
(((df1[['act_calling', 'act_visit']].eq('yes'))&(df2['po'].eq('no'))).groupby(df2['company_name']).any().all(axis = 1).sum())
预期输出
- 3,(A, B, C)
- 1,(C)
解决方案
1. 统计同时存在于两个DataFrame的公司数量
通过集合交集直接获取共同公司,统计长度即可:
import pandas as pd # 提取两个DataFrame的唯一公司集合 companies_df1 = set(df1['company'].unique()) companies_df2 = set(df2['company'].unique()) # 计算交集并统计数量 common_companies = companies_df1 & companies_df2 count_common = len(common_companies) print(f"同时存在的公司数量:{count_common},({', '.join(common_companies)})")
运行结果:同时存在的公司数量:3,(A, B, C)
2. 统计符合第二个条件的公司数量
拆分条件分步筛选,再取交集确保只统计共同存在的公司:
# 筛选df1中所有记录po均为'No'的公司 df1_valid = df1.groupby('company')['po'].apply(lambda x: (x == 'No').all()) valid_df1 = df1_valid[df1_valid].index.tolist() # 筛选df2中至少有一条记录act_call和act_visit均为'Yes'的公司 df2_valid = df2.groupby('company').apply( lambda x: ((x['act_call'] == 'Yes') & (x['act_visit'] == 'Yes')).any() ) valid_df2 = df2_valid[df2_valid].index.tolist() # 取三类集合的交集:符合df1条件、符合df2条件、同时存在于两个DataFrame target_companies = set(valid_df1) & set(valid_df2) & common_companies count_target = len(target_companies) print(f"符合条件的公司数量:{count_target},({', '.join(target_companies)})")
运行结果:符合条件的公司数量:1,(C)
逻辑说明
- 第一个统计用集合交集,高效且直接,避免了复杂的DataFrame操作;
- 第二个统计拆分两个子条件分别筛选,再与共同公司集合取交集,确保结果仅包含同时满足所有要求的公司,避免跨表操作的逻辑混乱。
内容的提问来源于stack exchange,提问作者babysoul
相关产品推荐
相关产品推荐

