如何合并列数不同的3个Pandas DataFrame并生成频次统计结果?
合并不同结构Pandas DataFrame的解决方案
先明确三个DataFrame的构造(方便复现)
先把你给出的原始数据转换成对应三个DataFrame:
import pandas as pd # 单列DataFrame df df = pd.DataFrame({ 'Itemcode': ['AAC', 'AAB', 'AAG', 'AAD', 'AAC'] }) # 单列DataFrame df2 df2 = pd.DataFrame({ 'Itemcode2': ['AAC', 'AAB', 'AAF', 'AAD', None] }) # 双列DataFrame df3 df3 = pd.DataFrame({ 'Itemcode': ['AAC', 'AAB', 'AAT', 'AAD', 'AAF'], 'count': [2, 1, 0, 1, 1] })
处理步骤
- 统计单列DataFrame的频次
对两个单列DataFrame分别做频次统计,转成带列名的DataFrame:
# 统计df的Itemcode出现频次,重命名列 df_counts = df['Itemcode'].value_counts().rename('df').to_frame() # 统计df2的Itemcode2出现频次,重命名列 df2_counts = df2['Itemcode2'].value_counts().rename('df2').to_frame()
- 收集所有唯一编码作为统一索引
要覆盖三个DataFrame里出现的所有编码,保证合并后没有遗漏:
all_codes = pd.concat([df['Itemcode'], df2['Itemcode2'].dropna(), df3['Itemcode']]).unique()
如果只需要你预期结果里的编码,直接指定即可:all_codes = ['AAC', 'AAB', 'AAT', 'AAD', 'AAF']
- 整理双列DataFrame的结构
将df3的Itemcode设为索引,提取count列并重命名:
df3_counts = df3.set_index('Itemcode')['count'].rename('df3').to_frame()
- 合并并填充缺失值
用统一索引对齐三个DataFrame,缺失值填充为0:
result = pd.concat([ df_counts.reindex(all_codes, fill_value=0), df2_counts.reindex(all_codes, fill_value=0), df3_counts.reindex(all_codes, fill_value=0) ], axis=1) # 去掉索引名,和预期结果格式一致 result.index.name = None print(result)
最终输出
df df2 df3 AAC 2 1 2 AAB 1 1 1 AAT 0 0 0 AAD 1 1 1 AAF 0 1 1
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

