如何在基于单列合并两个CSV文件的Python脚本中保留未匹配行?
解决方案:基于userId全外连接合并两个CSV文件
我来帮你搞定这个需求!用Python的pandas库就能轻松实现全外连接——也就是保留两个文件里所有的行,不管userId是否匹配,完全符合你的要求。
第一步:先准备好环境
如果你还没装pandas,先打开终端/命令行执行这个命令安装:
pip install pandas
第二步:编写合并脚本
直接用下面的代码,记得把文件路径换成你自己的实际路径就行:
import pandas as pd # 读取两个CSV文件 # 替换成你的第一个CSV文件路径(用户分组数据) df_user_groups = pd.read_csv('user_groups.csv') # 替换成你的第二个CSV文件路径(用户活动数据) df_user_activity = pd.read_csv('user_activity.csv') # 核心操作:基于userId做全外连接,保留所有行 merged_data = pd.merge( df_user_groups, df_user_activity, on='userId', # 指定连接的共同列 how='outer' # outer表示保留所有匹配/未匹配的行 ) # 将合并结果保存为新的CSV,index=False是避免写入多余的索引列 merged_data.to_csv('merged_result.csv', index=False)
代码说明
how='outer'是最关键的参数:它会把两个文件里的所有行都保留下来。如果某个userId只在其中一个文件里出现,另一个文件对应的列会自动填充为NaN(空值),不会丢失任何数据。- 替换文件路径的时候,要是你的文件不在当前脚本的目录下,记得写绝对路径,比如
'D:/project_data/user_groups.csv'或者'/Users/xxx/data/user_activity.csv'。
合并后的效果示例
对应你给出的测试数据,合并后的结果会是这样的(部分行展示):
| abTestGroup | platform | countryCode | userId | dateActivity | productId | cost |
|---|---|---|---|---|---|---|
| group_control | ios | GB | aaaaaaaaaaa | 2018-03-02 | specialpack | 0.198 |
| group_control | ios | GB | aaaaaaaaaaa | 2018-03-03 | specialpack | 0.498 |
| group_test | android | GB | ccccccccccc | 2018-03-02 | specialpack | 0.998 |
| NaN | NaN | NaN | bbbbbbbbbbb | 2018-03-02 | specialpack | 0.398 |
你看,userId为bbbbbbbbbbb的行只在第二个文件里有,合并后就保留了下来,前面的列用NaN填充;而第一个文件里重复的userId也会和第二个文件的匹配行一一对应展开。
内容的提问来源于stack exchange,提问作者Datacrawler
相关产品推荐
相关产品推荐

