You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按Date分组计算股票占比时日期列出现NaN的问题

搞定Date列NaN问题,精准计算股票占比

哈哈,我一眼就瞅出问题出在哪啦!你的Date列显示NaN,主要是两个小失误:

  • 分组的时候没必要把Date列放进聚合字段里呀!groupby('Date')已经把日期当成分组依据了,对Date列做count/sum完全没意义,反而会生成无效的NaN值。
  • 后面用reset_index(level=0, drop=True)直接把分组的日期索引丢了,结果自然就没了正确的日期标识,Date列也就变成NaN咯。

修改后的代码

def count_number_of_stocks_above_mean(data_frame):
    # 先过滤掉权重为0的股票,这步没问题
    data_frame = data_frame.loc[data_frame['Port. Weight'] > 0]
    
    # 按日期分组,直接用size统计每组总股票数,自动保留Date作为索引
    total_stocks = data_frame.groupby('Date').size().rename('Total Stocks')
    
    # 按日期分组,对"Price above Mean"求和,统计高于均值的股票数量
    above_mean_stocks = data_frame.groupby('Date')['Price above Mean'].sum().rename('Stocks Above Mean')
    
    # 计算占比,保留4位小数,还能给列名起个直观的名字
    prct_above_mean = round(above_mean_stocks / total_stocks, 4).rename('Percent Above Mean')
    
    # 要是你想把Date从索引改成普通列,就解开下面这行注释
    # prct_above_mean = prct_above_mean.reset_index()
    
    return prct_above_mean

为啥这么改更靠谱?

  • 用groupby('Date').size()统计总股票数,比你之前count多列高效多了,而且自动把Date设为索引,不会丢日期信息。
  • 只针对Price above Mean列求和,避免了对Date列的无效操作,从根源上杜绝NaN的出现。
  • 给每列重命名后,结果DataFrame的可读性拉满,一眼就能看懂每个字段的意思。

拿你给的示例数据测试的话,1989-02-09有2只股票,1只高于均值,结果会显示Date为1989-02-09,占比0.5,完全符合预期,Date列再也不会是NaN啦!

内容的提问来源于stack exchange,提问作者krakowi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 07:52:45