如何在Python中合并两个互补同索引的Series为单列DataFrame?
解决方法:用
combine_first()或fillna()处理互补Series合并 你的场景特别适合用Pandas里的互补填充类方法,因为两个Series的索引位置是完全互补的(每个索引只有一个有值,另一个为空),concat/append这类拼接方法自然达不到你要的“二选一取有效值”的效果。
先构造可复现的示例数据
首先把你的示例转换成可运行的代码:
import pandas as pd df1 = pd.Series(['A', 'B', None, 'D', 'E', None, None, 'G'], name='c1') df2 = pd.Series([None, None, 'C', None, None, 'F', None, None], name='c2')
方法1:使用combine_first()(推荐)
这个方法的逻辑是:优先保留当前Series的有效值,空值的位置用传入的Series对应位置的值填充,完美匹配你的需求:
# 合并后转成单列DataFrame combined_df = df1.combine_first(df2).to_frame(name='combined') print(combined_df)
方法2:使用fillna()
原理和上面一致,用df2的值填充df1里的空值:
combined_df = df1.fillna(df2).to_frame(name='combined') print(combined_df)
运行结果(和你的期望一致)
combined 0 A 1 B 2 C 3 D 4 E 5 F 6 None 7 G
如果希望空值显示为空字符串而不是None,可以再加一步替换:
combined_df = df1.combine_first(df2).replace({pd.NA: ''}).to_frame(name='combined')
为什么之前的方法不行?
concat是把两个Series作为不同的列拼在一起,不会合并有效值;append是把两个Series的行堆叠起来,会出现重复索引;union是取索引的并集,同样不会处理值的互补填充。
内容的提问来源于stack exchange,提问作者twhale
相关产品推荐
相关产品推荐

