Pandas按日期melt DataFrame后值全为NaN的解决方法
嘿,我一眼就看出问题所在了——你在value_vars里用了pd.date_range生成的Timestamp对象,但你的DataFrame里的日期列名其实是字符串格式(比如"1/22/20"),这俩类型完全不匹配,导致melt找不到对应的列,自然所有值都变成NaN啦!
问题根源拆解
你的原DataFrame日期列名是字符串格式(如"1/22/20"),但pd.date_range('1/22/20', '3/18/20', freq='D')生成的是Timestamp对象(比如2020-01-22 00:00:00)。两者类型不兼容,melt无法匹配到对应列,所以返回的Total_Count全是缺失值。
两种修复方案(任选其一即可)
方法1:直接复用DataFrame中现有的日期列名(推荐)
不用手动生成日期范围,直接提取原DataFrame里除Country之外的所有列作为value_vars,绝对不会出现匹配错误:
import pandas as pd def meltDataFrame(df, id_vars, value_vars, var_name, value_name): return pd.melt(df, id_vars=id_vars, value_vars=value_vars, var_name=var_name, value_name=value_name) # 提取原DataFrame中的日期列名(排除Country列) date_columns = data_df.columns[data_df.columns != 'Country'] # 执行melt转换 data_df_melt = meltDataFrame(data_df, ['Country'], date_columns, 'Date', 'Total_Count') # 可选:将Date列转换为datetime类型(方便后续时间序列分析) data_df_melt['Date'] = pd.to_datetime(data_df_melt['Date'])
方法2:将生成的日期范围转换成和原列名一致的字符串格式
如果你一定要手动指定日期范围,需要把pd.date_range生成的Timestamp转换成和原列名相同的字符串格式(比如"1/22/20"):
import pandas as pd def meltDataFrame(df, id_vars, value_vars, var_name, value_name): return pd.melt(df, id_vars=id_vars, value_vars=value_vars, var_name=var_name, value_name=value_name) # 生成日期范围并转换成和原列名一致的字符串格式 date_range = pd.date_range('1/22/20', '2/22/20', freq='D').strftime('%m/%d/%y') # 执行melt转换 data_df_melt = meltDataFrame(data_df, ['Country'], date_range, 'Date', 'Total_Count') # 可选:转换为datetime类型 data_df_melt['Date'] = pd.to_datetime(data_df_melt['Date'])
测试验证
我们用模拟数据测试一下方法1的效果:
# 模拟测试数据 data_df = pd.DataFrame({ 'Country': ['US', 'Australia'], '1/22/20': [10, 5], '1/23/20': [15, 7] }) # 应用修复后的代码 date_columns = data_df.columns[data_df.columns != 'Country'] data_df_melt = meltDataFrame(data_df, ['Country'], date_columns, 'Date', 'Total_Count') data_df_melt['Date'] = pd.to_datetime(data_df_melt['Date']) print(data_df_melt)
输出结果:
Country Date Total_Count 0 US 2020-01-22 10 1 Australia 2020-01-22 5 2 US 2020-01-23 15 3 Australia 2020-01-23 7
完美解决了NaN问题!
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

