如何合并两个单列DataFrame以得到指定结果?
问题解决:按行位置合并两个单列DataFrame
原始数据
处理数据集后得到两个单列DataFrame:
df1
| df1 列1 |
|---|
| False |
| Invalid |
| False |
| False |
df2
| df2 列1 |
|---|
| False |
| False |
| False |
| Not Found |
期望输出
需要合并为以下单列DataFrame:
| 列1 |
|---|
| False |
| Invalid |
| False |
| Not Found |
尝试过程中的问题
我尝试用pd.merge,测试了inner/outer/left/right所有合并方式,代码如下:
# tried all, inner, outer, left, and right merge = pd.merge(bounce, domain, how = 'outer', on = 'description') merge.head(10)
但结果完全不符合预期,不同合并方式的结果示例:
| 使用inner | 使用outer | 使用left | 使用right |
|---|---|---|---|
| False | invalid | Invalid | False |
| False | invalid | False | False |
| False | False | False | False |
| False | False | False | False |
说实话,我不理解为什么仅含一列时,不同的合并方式会得到不同结果。
原因分析
merge/join是基于列值的关联合并,不是按行位置对应合并。当你指定on='description'时,它会把两个DataFrame中该列值相同的行做匹配:比如df1里的False会和df2里的所有False匹配,生成重复行;Invalid在df2中没有匹配值,outer合并会保留该行但也会带出匹配的False行,这就是不同合并方式结果不同的核心原因——它们的匹配逻辑本身就有差异,和列数多少无关。
正确解决方案
你的需求是按行索引位置对应合并,优先保留非False的值,以下两种方法都可以实现:
方法1:按索引遍历取值
直接遍历每一行,当df1的值不是False时取df1,否则取df2的值:
import pandas as pd # 模拟你的数据 df1 = pd.DataFrame({'列1': [False, 'Invalid', False, False]}) df2 = pd.DataFrame({'列1': [False, False, False, 'Not Found']}) # 生成结果 result = pd.DataFrame({ '列1': [df1.iloc[i, 0] if df1.iloc[i, 0] != False else df2.iloc[i, 0] for i in range(len(df1))] }) print(result)
方法2:用concat结合空值填充
先按列拼接两个DataFrame,把False替换为空值,再按行取第一个非空值:
import pandas as pd # 模拟数据 df1 = pd.DataFrame({'列1': [False, 'Invalid', False, False]}) df2 = pd.DataFrame({'列1': [False, False, False, 'Not Found']}) # 拼接后处理 combined = pd.concat([df1, df2], axis=1) result = combined.replace(False, pd.NA).bfill(axis=1).iloc[:, 0].to_frame('列1') print(result)
两种方法都能输出你想要的结果。
内容的提问来源于stack exchange,提问作者daza
相关产品推荐
相关产品推荐

