Pandas合并DataFrame后无法更新全部匹配行的问题求助
Pandas合并DataFrame后无法更新全部匹配行的问题求助
我最近在处理Pandas DataFrame的时候遇到了一个头疼的问题:我想基于共同列ID把两个DataFrame合并,然后用第二个DataFrame(reference)里的值去更新原始DataFrame(df)的Target Value列。明明ID都是完全匹配的,但就是只有部分行能被更新——比如这次测试里有5行,结果只更新了前2行,剩下3行的Target Value还是NaN。
先给大家看看我的数据:
原始DataFrame(df)
ID Other Column Target Value 0 ID00123 Value A NaN 1 ID00456 Value B NaN 2 ID00789 Value C NaN 3 ID01012 Value D NaN 4 ID01345 Value E NaN
参考DataFrame(reference)
ID Reference Value 0 ID00123 RefVal1 1 ID00456 RefVal2 2 ID00789 RefVal3 3 ID01012 RefVal4 4 ID01345 RefVal5
我尝试的代码
# Merge dataframes on 'ID' merged = df.merge(reference, on='ID', how='left', indicator=True) # Create a mask for rows to update mask = ( (merged['_merge'] == 'both') & # Exists in both DataFrames (df['Target Value'].isna()) # 'Target Value' is NaN ) # Update 'Target Value' in df df.loc[mask, 'Target Value'] = merged.loc[mask, 'Reference Value']
合并后的DataFrame看起来一切正常,所有行的_merge都是both:
ID Other Column Target Value Reference Value _merge 0 ID00123 Value A NaN RefVal1 both 1 ID00456 Value B NaN RefVal2 both 2 ID00789 Value C NaN RefVal3 both 3 ID01012 Value D NaN RefVal4 both 4 ID01345 Value E NaN RefVal5 both
但更新后的原始df就不对劲了,只有前两行被更新:
ID Other Column Target Value 0 ID00123 Value A RefVal1 1 ID00456 Value B RefVal2 2 ID00789 Value C NaN # 这行没更新 3 ID01012 Value D NaN # 这行也没更新 4 ID01345 Value E NaN # 还有这行
我已经排查了很多可能性:
- 试过用内连接代替左连接,结果还是只有部分行被更新
- 检查过
ID列的数据类型,两个DataFrame里都是object类型 - 给
ID列做了清洗:去掉前后空格并转成小写,代码如下:df['ID'] = df['ID'].str.strip().str.lower() reference['ID'] = reference['ID'].str.strip().str.lower() - 检查过两个DataFrame里的
ID是否有不匹配的情况,结果两个集合都是空的:unmatched_df = set(df['ID']).difference(reference['ID']) unmatched_reference = set(reference['ID']).difference(df['ID']) print(unmatched_df, unmatched_reference) # 输出都是空集合 - 确认过没有重复行,整个df里就只有10行数据(测试用的是5行)
而且这不是第一次遇到这个问题了!之前处理5万多条数据的时候也出现过:合并表显示所有行都匹配,但就是只有部分行能被更新。更奇怪的是,当时去重后的表无法正常更新,但保留重复行的表反而能正常工作。
有没有大佬能帮我看看这到底是哪里出问题了?谢谢大家!
备注:内容来源于stack exchange,提问作者melca
相关产品推荐
相关产品推荐

