如何在Pandas DataFrame顶部添加带日期字段的新行并解决日期丢失问题
问题:在Pandas DataFrame顶部添加新行后原有日期字段变为NaN
尝试在已有Pandas DataFrame顶部添加新行,使用pd.concat拼接后,原有行的日期字段全部显示为NaN。操作步骤如下:
- 读取CSV文件:
import pandas as pd loro = pd.read_csv('path to csv file', delimiter=';')
- 转换日期格式并设置索引:
loro['DATE']=pd.to_datetime(loro['DATE']) cols = ['N1','N2','N3','N4','N5','E1','E2'] loro.set_index('DATE',inplace=True) loto = loro[cols].copy() loto.head()
此时输出的DataFrame:
N1 N2 N3 N4 N5 E1 E2 DATE 2023-10-17 10 17 20 35 40 3 4 2023-10-13 21 26 28 40 41 2 4 2023-10-10 18 20 22 33 43 3 9 2023-10-06 21 29 31 34 43 2 9 2023-10-03 6 20 22 24 45 4 5
- 创建新行并拼接:
new_row = pd.DataFrame({'DATE':'2023-10-20'}, index =[0]) loto = pd.concat([new_row, loto]).reset_index(drop = True) loto.head(5)
拼接后结果:
DATE N1 N2 N3 N4 N5 E1 E2 0 2023-10-20 NaN NaN NaN NaN NaN NaN NaN 1 NaN 10.0 17.0 20.0 35.0 40.0 3.0 4.0 2 NaN 21.0 26.0 28.0 40.0 41.0 2.0 4.0 3 NaN 18.0 20.0 22.0 33.0 43.0 3.0 9.0 4 NaN 21.0 29.0 31.0 34.0 43.0 2.0 9.0
期望添加新行后不影响原有行的日期字段,求正确操作方法。
解决方案
原因分析
你的loto DataFrame已经将DATE设置为索引,而非普通列。拼接时new_row包含DATE列,但原有数据的DATE只存在于索引中,reset_index(drop=True)又直接丢弃了原有索引,导致原有行的DATE列没有值,全部显示为NaN。
方法一:先将索引转为列,再拼接
先把loto的索引恢复成普通列,再和新行拼接,最后可选重新设置索引:
# 将DATE索引转为普通列 loto_reset = loto.reset_index() # 创建包含完整字段的新行(缺失字段设为NaN或对应值) new_row = pd.DataFrame({ 'DATE': pd.to_datetime('2023-10-20'), 'N1': None, 'N2': None, 'N3': None, 'N4': None, 'N5': None, 'E1': None, 'E2': None }, index=[0]) # 拼接并重置索引 loto_updated = pd.concat([new_row, loto_reset], ignore_index=True) # 可选:重新将DATE设为索引 loto_updated.set_index('DATE', inplace=True) loto_updated.head()
方法二:保持索引一致,拼接后再处理
创建新行时将DATE作为索引,和原DataFrame结构一致后再拼接,最后按需重置索引:
# 创建新行,DATE作为索引,其他字段设为NaN或对应值 new_row = pd.DataFrame( [[None, None, None, None, None, None, None]], index=pd.to_datetime(['2023-10-20']), columns=['N1','N2','N3','N4','N5','E1','E2'] ) # 拼接两个DataFrame(索引一致) loto_updated = pd.concat([new_row, loto]) # 可选:重置索引并保留DATE列 loto_updated = loto_updated.reset_index().rename(columns={'index': 'DATE'}) loto_updated.head()
注意事项
- 新行的字段要和原DataFrame完全匹配,避免拼接后出现列缺失或多余
- 如果新行有具体数值,替换
None为对应值即可
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

