Python3.7中两个DataFrame的条件合并问题
你的方法不可行,问题出在这几点:
- 用
iterrows()遍历的时候,每次循环里的merge操作结果没有被保存,只是临时执行,不会生成最终的合并结果。 - 判断空值用
row['term1'] is None不准确,Pandas里的空值一般是NaN,得用pd.isna()来判断才对。 - 循环里的
break会直接终止整个循环,而不是跳过空值行,完全不符合你“忽略值为None的情况”的需求。
更高效的实现方式
别用循环,用Pandas的内置方法处理,效率高还不容易出错:
步骤1:把df1转成“长格式”,过滤空值
先把term1和term2里的非空值单独拆成一行,保留对应的col1信息:
import pandas as pd # 先构造你的df1(如果已经有了就跳过这步) df1 = pd.DataFrame({ 'col1': ['ab|a', 'cd'], 'term1': ['ab', 'cd'], 'term2': ['a', pd.NA] }) # 转换为长格式,过滤掉空的term df_long = df1.melt(id_vars=['col1'], value_vars=['term1', 'term2'], value_name='term') df_long = df_long.dropna(subset=['term']).drop(columns=['variable'])
处理后df_long的结构是:
| col1 | term |
|---|---|
| ab | a |
| ab | a |
| cd | cd |
步骤2:和df2合并
直接用处理后的长格式表和df2按对应列做内合并:
# 示例df2(替换成你的实际df2) df2 = pd.DataFrame({ 'STR': ['ab', 'a', 'cd', 'ef'], 'value': [1, 2, 3, 4] }) # 执行合并 final_result = df_long.merge(df2, left_on='term', right_on='STR', how='inner')
这样就自动忽略了所有空值的情况,得到所有有效term匹配后的结果。
如果要保留原df1的行结构
要是你希望最终结果和原df1的行对应,把同一行的匹配结果聚合起来,可以这样做:
result_grouped = final_result.groupby('col1').agg( 匹配的terms=('term', ', '.join), 对应的值=('value', ', '.join) ).reset_index()
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

