基于DataFrame共有列匹配统计符合条件行数的技术求助
解决DataFrame行匹配计数问题
问题需求
统计DataFrame df中每行与df2共有列(A、B、C)值完全匹配的行数,生成带Count列的结果。
示例数据
import pandas as pd df = pd.DataFrame([{'id':1, 'A': 'False', 'B' : 'False' , 'C':'NA'},{'id':2, 'A': 'True', 'B' : 'False' , 'C':'NA'}]) df2 = pd.DataFrame([{'A':'True', 'B': 'False' , 'C':'NA', 'D': 'True'}])
df表格:
| id | A | B | C |
|---|---|---|---|
| 1 | False | False | NA |
| 2 | True | False | NA |
df2表格:
| A | B | C | D |
|---|---|---|---|
| True | False | NA | True |
期望输出
| id | A | B | C | Count |
|---|---|---|---|---|
| 1 | False | False | NA | 0 |
| 2 | True | False | NA | 1 |
尝试的无效代码
for i in range(columns): x = action_value_counts_df.columns[i] if compare_column.equals(action_value_counts_df[x]): print(x, 'Matched') else: print(x,'Not Matched')
正确实现方案
方案1:合并+分组计数
通过统计df2中匹配组合的出现次数,再与原表左连接得到结果:
import pandas as pd # 初始化数据 df = pd.DataFrame([{'id':1, 'A': 'False', 'B' : 'False' , 'C':'NA'},{'id':2, 'A': 'True', 'B' : 'False' , 'C':'NA'}]) df2 = pd.DataFrame([{'A':'True', 'B': 'False' , 'C':'NA', 'D': 'True'}]) # 定义共有列 common_cols = ['A', 'B', 'C'] # 统计df2中各组合的出现次数 match_counts = df2[common_cols].value_counts().reset_index(name='Count') # 左连接到原df,缺失值填充为0 result = df.merge(match_counts, on=common_cols, how='left').fillna({'Count': 0}) # 确保Count为整数类型 result['Count'] = result['Count'].astype(int) print(result)
运行输出:
id A B C Count 0 1 False False NA 0 1 2 True False NA 1
方案2:逐行判断匹配
将df2的匹配组合转为集合,逐行检查是否存在:
import pandas as pd # 初始化数据 df = pd.DataFrame([{'id':1, 'A': 'False', 'B' : 'False' , 'C':'NA'},{'id':2, 'A': 'True', 'B' : 'False' , 'C':'NA'}]) df2 = pd.DataFrame([{'A':'True', 'B': 'False' , 'C':'NA', 'D': 'True'}]) common_cols = ['A', 'B', 'C'] # 生成df2的匹配组合集合 df2_match_set = set(tuple(row) for row in df2[common_cols].values) # 逐行判断并添加Count列 df['Count'] = df[common_cols].apply(lambda row: 1 if tuple(row) in df2_match_set else 0, axis=1) print(df)
该方案直接在原df上生成结果,输出与方案1一致。
内容的提问来源于stack exchange,提问作者Albert Einstein
相关产品推荐
相关产品推荐

