Pandas索引完全匹配时列仍被赋值NaN的问题排查
问题原因与解决方案
问题根源
你执行赋值时得到NaN的核心原因是:str.split(expand=True)生成的临时DataFrame列名为0和1,而你试图将其赋值给原DataFrame的date、time列时,pandas会按列名匹配进行赋值——由于两边列名不对应,最终所有值被填充为NaN。
解决方案
方案1:重命名拆分后的列再赋值
先给拆分结果指定对应列名,再完成赋值:
split_result = df.index.astype(str).to_series().str.split(' ', expand=True) split_result.columns = ['date', 'time'] df[['date', 'time']] = split_result
方案2:直接使用位置值赋值
跳过列名匹配,直接用拆分结果的底层数值数组赋值:
df[['date', 'time']] = df.index.astype(str).str.split(' ', expand=True).values
方案3:利用DatetimeIndex的原生属性提取(推荐)
无需转换为字符串,直接通过dt属性提取日期和时间,效率更高且更可靠:
df['date'] = df.index.date.astype(str) df['time'] = df.index.time.astype(str)
验证结果
执行任意一种方案后,DataFrame将正确生成date和time列:
date time val 2015-01-02 09:30:00 2015-01-02 09:30:00 64.8150 2015-01-02 09:35:00 2015-01-02 09:35:00 64.8741 2015-01-02 09:40:00 2015-01-02 09:40:00 64.8741 2015-01-02 09:45:00 2015-01-02 09:45:00 64.8741 2015-01-02 09:50:00 2015-01-02 09:50:00 64.8741 2015-01-02 09:55:00 2015-01-02 09:55:00 65.0255 2015-01-02 10:00:00 2015-01-02 10:00:00 64.9269 2015-01-02 10:05:00 2015-01-02 10:05:00 64.9269
内容的提问来源于stack exchange,提问作者Himanshu Poddar
相关产品推荐
相关产品推荐

