如何合并两个Pandas DataFrame,生成逗号分隔的匹配值列?
Pandas复合索引多对多合并:将匹配值合并为逗号分隔列
现有两个Pandas DataFrame:
eig_df:人员数据表,以KG-EZ和EZ为复合索引,索引不唯一gst_df:人员名下的地块数据表,同样以KG-EZ和EZ为复合索引,索引不唯一
源数据代码:
import pandas as pd eig_df = pd.DataFrame({ 'KG-EZ': [50101,50101,50101,50101,50103], 'EZ': [17,18,19,19,1], 'Name': ['Name1','Name2','Name3','Name4','Name5'] }) eig_df.set_index(['KG-EZ', 'EZ'], inplace=True) gst_df = pd.DataFrame({ 'KG-EZ': [50101,50101,50101,50101,50101,50103,50103], 'EZ': [17,17,18,19,19,1,1], 'GST-NR': ['GST1','GST2','GST3','GST4','GST5','GST6','GST7'] }) gst_df.set_index(['KG-EZ', 'EZ'], inplace=True)
需求:为eig_df新增GST-NR列,该列包含gst_df中所有匹配索引的GST-NR值,以逗号分隔,预期结果如下:
result_df = pd.DataFrame({ 'KG-EZ': [50101,50101,50101,50101,50103], 'EZ': [17,18,19,19,1], 'Name': ['Name1','Name2','Name3','Name4','Name5'], 'GST-NR': ['GST1,GST2','GST3','GST4,GST5','GST4,GST5','GST6,GST7'] }) result_df.set_index(['KG-EZ', 'EZ'], inplace=True)
解决方案
先把gst_df里同一复合索引下的所有GST-NR合并成一个逗号分隔的字符串,再通过索引和eig_df合并,避免产生重复行。
1. 聚合地块编号
对gst_df按复合索引分组,将每组的GST-NR直接拼接为逗号分隔的字符串:
gst_agg = gst_df.groupby(level=['KG-EZ', 'EZ'])['GST-NR'].apply(','.join)
2. 合并到人员表
利用join()方法基于复合索引合并,两个表的索引会自动匹配对应:
result_df = eig_df.join(gst_agg)
验证结果
打印result_df即可得到预期输出:
print(result_df)
输出结果:
Name GST-NR KG-EZ EZ 50101 17 Name1 GST1,GST2 18 Name2 GST3 19 Name3 GST4,GST5 19 Name4 GST4,GST5 50103 1 Name5 GST6,GST7
内容的提问来源于stack exchange,提问作者Pipelynx
相关产品推荐
相关产品推荐

