按日期设置索引并分组后仅返回NaN值的Pandas问题
问题分析与解决
你的代码出现全NaN的原因有两个:
- 分组逻辑错误:仅按
token_address分组,计算的是该token所有日期的整体中位数,而非每日每个token的中位数,不符合需求。 - 索引不匹配:
groupby('token_address')['close'].median()返回的结果以token_address为索引,原DataFrame用默认数字索引,pandas无法将两者对齐,因此填充NaN。
正确解法
方法1:用transform直接生成对应列(推荐)
transform会保留原DataFrame的索引结构,直接将分组计算的中位数映射到每一行:
df['date'] = pd.to_datetime(df['date']) df['median'] = df.groupby(['token_address', 'date'])['close'].transform('median')
方法2:先计算中位数表再合并
如果需要单独保存每日每个token的中位数结果,可先分组计算,再通过merge合并回原表:
df['date'] = pd.to_datetime(df['date']) # 计算每日每个token的中位数并重置索引 median_df = df.groupby(['token_address', 'date'])['close'].median().rename('median').reset_index() # 合并到原表 df = df.merge(median_df, on=['token_address', 'date'], how='left')
执行后,median列会正确显示对应日期、对应token的close价格中位数。
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

