【问题标题】:Missing data count with PandasPandas 缺少数据计数
【发布时间】:2026-01-25 13:40:01
【问题描述】:

我有一个带有 TimeSeries 的 pandas.DataFrame(所有列都转换为 float),它使用 DatetimeIndex(粒度/频率约为 1 小时)作为行索引,MultiIndex 用于列。系列中有缺失数据(但没有缺失行,设置了频率)。我想按月计算获取绩效(百分比)。

def mapMonth(x):
    return x.replace(day=1, hour=0, minute=0, second=0, microsecond=0)

c = data.groupby(mapMonth).count()

上面的代码似乎计算了忽略NaN 的值,这正是我想要的。现在我想将这个聚合的 DataFrame 除以预期的计数。

n = pd.DataFrame(np.full((data.shape[0],), 1, dtype=float), index=data.index).groupby(groupby.mapMonth).sum()

它按月为我提供了预期的数据计数,但我发现这种方式非常棘手。 无论如何,我无法成功将 DataFrame c 除以 n 使用:

p = c.div(n, axis=0)

DataFrame 看起来像:

networkkey      RTU                                                         
measurandkey    NO2
sitekey      41B001 41B004 41B006 41B008 41B011 41MEU1 41N043 41R001 41R002
channelid       280    27     38     55     59     86     103    122    168
2012-01-01        0    728    728      0    728    732    728    728    728
2012-02-01        0    679    678      0    680    686    681    681    679
2012-03-01        0    728    727      0    727    720    726    728    722
2012-04-01        0    705    698      0    702    710    699    705    701
2012-05-01        0    728    728      0    726    728    725    724    680
2012-06-01        0    703    700      0    701    710    705    705    705
2012-07-01        0    728    728      0    728    657    707    728    728

                0
2012-01-01  744.0
2012-02-01  696.0
2012-03-01  744.0
2012-04-01  720.0
2012-05-01  744.0
2012-06-01  720.0
2012-07-01  744.0
2012-08-01  744.0
2012-09-01  720.0
2012-10-01  744.0
2012-11-01  720.0
2012-12-01  744.0

我怀疑问题出在MultiIndex 上。无论如何,我觉得这种方法并不简单。

有没有更清洁/切割的东西来用 Pandas 计算这个聚合?

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    我终于找到了不会忽略NaNsize 函数。因此,以下代码在几行中执行我想要的:

    # Group Data:
    g = data.groupby(groupby.mapMonth)
    
    # Compute Performance
    c = g.count()
    n = g.size()
    d = c.div(n, axis=0)
    

    【讨论】:

    • 感谢您分享解决问题的方法。 :)