合并不等长时间序列DataFrame并拼接列表值避免NaN的解决方案
合并列表值型时间序列DataFrame的解决方案
你可以直接使用Pandas的add方法,通过fill_value参数指定缺失值填充为空列表,即可避免非重叠日期出现NaN的问题。
代码示例
import pandas as pd # 示例数据构造 df1 = pd.DataFrame( {"val": [["AAA", "BBB"], ["CCC"], ["DDD"]]}, index=pd.to_datetime(["2021-09-16", "2021-09-17", "2021-09-18"]) ) df2 = pd.DataFrame( {"val": [["EEE"], ["FFF"], [], ["GGG"], ["HHH", "III"]]}, index=pd.to_datetime(["2021-09-16", "2021-09-17", "2021-09-18", "2021-09-19", "2021-09-20"]) ) # 核心合并逻辑 merged_df = df1.add(df2, fill_value=[])
运行结果
执行后得到的merged_df完全符合预期:
| 日期 | val |
|---|---|
| 2021-09-16 | [AAA, BBB, EEE] |
| 2021-09-17 | [CCC, FFF] |
| 2021-09-18 | [DDD] |
| 2021-09-19 | [GGG] |
| 2021-09-20 | [HHH, III] |
实现原理
- 直接使用
+运算符相加时,Pandas会自动将两个DataFrame非重叠索引的位置填充为NaN,NaN与列表相加结果仍为NaN - 用
add方法的fill_value参数指定填充值为[]后,非重叠位置的缺失值会被替换为空列表,与原列表相加后直接保留原列表内容,重叠位置的两个列表正常拼接。
注意事项
- 如果两个DataFrame的列名不同,需要先将存储列表的列名统一,或单独提取对应列做合并操作:
merged_series = df1['列名1'].add(df2['列名2'], fill_value=[]) - 确保所有待合并的字段值均为列表类型,避免类型不匹配报错
- 低版本Pandas如果不支持
fill_value传入列表,可以使用对齐索引的兼容写法:df1_aligned, df2_aligned = df1.align(df2, fill_value=[]) merged_df = df1_aligned + df2_aligned
内容的提问来源于stack exchange,提问作者Drive2blue
相关产品推荐
相关产品推荐

