如何向以日期为索引的空Pandas DataFrame追加带日期的Series
解决向date索引的DataFrame追加Series的问题
我来帮你捋清楚这个问题哈~你遇到的报错根源在于:你的DataFrame已经把date设为索引了,但你创建的new_row是把date当成普通列来处理的,这就导致append时索引和列完全无法对齐,自然会报错。而ignore_index=True会强制重置整个DataFrame的索引,把原本的date索引转成普通列,这显然不是你想要的效果。
下面给你两种实用的解决方案:
方法一:从初始化就规范索引结构
这种方式一开始就把DataFrame的索引设置为date(用DatetimeIndex处理日期类型更专业),后续追加的Series直接把日期作为name(也就是索引值),列对应Y1和Y2:
import pandas as pd # 初始化空DataFrame,指定索引为date,列是Y1、Y2 df = pd.DataFrame({'Y1': [], 'Y2':[]}, index=pd.DatetimeIndex([], name='date')) # 创建新Series:name是目标日期(作为索引值),index对应DataFrame的列名 new_row = pd.Series(data=[0.2, 0.4], index=['Y1', 'Y2'], name='2005-01-30') # 追加到DataFrame df = df.append(new_row)
执行后,df的索引就是2005-01-30,Y1和Y2的值也会正确对应。
方法二:调整现有new_row的结构适配索引
如果想保留你原来的DataFrame初始化方式,可以把new_row里的日期值提取出来作为它的name,只保留Y1和Y2的内容再追加:
import pandas as pd df = pd.DataFrame({'date': [], 'Y1': [], 'Y2':[]}) df.set_index(['date'], inplace=True) # 方式1:直接构造符合要求的Series new_data = {'Y1': 0.2, 'Y2': 0.4} new_row = pd.Series(new_data, name='2005-01-30') df = df.append(new_row) # 方式2:从你原来的new_row转换而来 original_row = pd.Series(data=['2005-01-30', 0.2, 0.4], index=['date', 'Y1', 'Y2']) # 把date的值作为name,筛选Y1、Y2列生成新Series adjusted_row = pd.Series(original_row[['Y1','Y2']], name=original_row['date']) df = df.append(adjusted_row)
核心逻辑其实很简单:当你的DataFrame以date为索引时,要追加的每一行数据,它的name就是日期索引值,而Series的index要和DataFrame的列名完全对应,这样append才能正确匹配索引和列,不会出现报错。
内容的提问来源于stack exchange,提问作者Oliver Angelil
相关产品推荐
相关产品推荐

