如何将Python列表插入Pandas DataFrame指定行并设其余值为NaN
向Pandas DataFrame的日期索引中插入指定日期行(其余值为NaN)
问题需求
需将Python列表中的日期作为新行插入已有DataFrame的Date索引列,新插入行的其余列值设为NaN。
示例日期列表
list_dates = ['2021-12-01', '2021-12-02', '2021-12-03', '2021-12-06', '2021-12-08']
现有DataFrame片段
df_sentiment.iloc[10:20, : 10]
ticker AAPL.OQ ABBV.N ABT.N ACN.N ADBE.OQ AIG.N AMD.OQ AMGN.OQ AMT.N AMZN.OQ Date 2021-11-24 NaN NaN NaN NaN NaN NaN NaN 0.632792 NaN NaN 2021-11-25 NaN 0.211714 NaN 0.846193 0.210173 NaN NaN 0.043700 NaN NaN 2021-11-26 NaN 0.115301 -0.629839 NaN 0.081402 -0.287198 NaN NaN -0.448907 NaN 2021-11-27 NaN NaN 0.384544 NaN 0.490425 -0.003641 0.253752 NaN NaN NaN 2021-11-28 NaN NaN 0.036393 NaN 0.003484 NaN NaN 0.056091 NaN NaN 2021-11-29 0.163266 -0.165520 0.149920 NaN -0.014639 -0.448595 0.097651 0.381039 0.058590 -0.016986 2021-11-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.557565 2021-12-07 NaN NaN NaN 0.097732 NaN NaN NaN NaN NaN NaN 2021-12-09 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
期望的更新后DataFrame片段
df_sentiment.iloc[10:20, : 10]
ticker AAPL.OQ ABBV.N ABT.N ACN.N ADBE.OQ AIG.N AMD.OQ AMGN.OQ AMT.N AMZN.OQ Date 2021-11-24 NaN NaN NaN NaN NaN NaN NaN 0.632792 NaN NaN 2021-11-25 NaN 0.211714 NaN 0.846193 0.210173 NaN NaN 0.043700 NaN NaN 2021-11-26 NaN 0.115301 -0.629839 NaN 0.081402 -0.287198 NaN NaN -0.448907 NaN 2021-11-27 NaN NaN 0.384544 NaN 0.490425 -0.003641 0.253752 NaN NaN NaN 2021-11-28 NaN NaN 0.036393 NaN 0.003484 NaN NaN 0.056091 NaN NaN 2021-11-29 0.163266 -0.165520 0.149920 NaN -0.014639 -0.448595 0.097651 0.381039 0.058590 -0.016986 2021-11-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.557565 2021-12-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-02 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-07 NaN NaN NaN 0.097732 NaN NaN NaN NaN NaN NaN 2021-12-08 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-09 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2021-12-10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
尝试过的方法
使用append和concat方法未成功或出现错误,寻求正确实现方式。
正确实现方式
推荐使用**重新索引(reindex)**的方式,这是Pandas处理日期索引补全最简洁高效的方案,步骤如下:
- 将目标日期列表转换为
datetime类型,确保与原DataFrame索引类型一致 - 合并原索引与新日期列表,去重并生成有序的完整索引
- 对原DataFrame重新索引,缺失值自动填充为NaN
代码实现
import pandas as pd # 1. 转换日期列表为datetime类型 new_dates = pd.to_datetime(list_dates) # 2. 合并原索引与新日期,去重后排序 full_index = df_sentiment.index.union(new_dates).sort_values() # 3. 重新索引DataFrame df_sentiment = df_sentiment.reindex(full_index)
补充说明
union()方法会自动去除重复项,若原DataFrame已存在目标日期,不会重复插入sort_values()保证索引按时间顺序排列,符合时间序列数据的逻辑reindex()默认将新增行的所有列值填充为NaN,完全匹配需求
如果之前使用concat失败,通常是因为未正确构造匹配列的空DataFrame。若坚持用concat,正确写法如下:
# 构造包含新日期的空DataFrame empty_df = pd.DataFrame(index=new_dates, columns=df_sentiment.columns) # 合并后排序索引 df_sentiment = pd.concat([df_sentiment, empty_df]).sort_index()
但此方法需手动处理去重,效率和简洁性不如reindex。
内容的提问来源于stack exchange,提问作者billv1179
相关产品推荐
相关产品推荐

