【问题标题】:np.average not working when data is missing when using pandas groupby使用 pandas groupby 时数据丢失时,np.average 不起作用
【发布时间】:2014-06-28 18:01:06
【问题描述】:

我一直在用 pandas groupby 和 numpy 的 np.average 计算加权平均值。问题似乎是数据中的缺失(即缺失;在 data 中,而不是在 weigths 中)。我在下面做了一个概念性的例子。

我想要的行为是,当数据丢失时,该记录的权重也会被忽略。简单地删除该行不是一种选择,因为其他数据列都填充了数据。我认为 np.ma.average 正是我所需要的,但这也给了我 NaN 的结果。

有什么建议吗?

df = pd.DataFrame({ 'groups': ['a','a','b','a','b','b'],
                    'data':  [3, 3, 4, 2, 2.5, np.nan],
                    'Weights': [1, 2, 1, 3, 1, 3]})

def wavg(subdf):
    series = pd.Series()
    for column in df.columns:
        series['np.mean'] = np.mean(subdf['data'])
        series['np.average (no weights)'] = np.average(subdf['data'])
        series['np.average (weighted)'] = np.average(subdf['data'], weights=subdf['Weights'])
        series['np.ma.average (weighted)'] = np.ma.average(subdf['data'], weights=subdf['Weights']) 
    return series

df.groupby('groups').apply(wavg)

这给了我

       np.mean  np.average  np.average  np.ma.average 
               (no weights)  (weighted)    (weighted)
groups              
a    2.666667    2.666667    2.5              2.5
b    3.250000    NaN         NaN          NaN

===================================== 出于好奇,这就是我最终使用的:

def wavg(subdf):
    series = pd.Series()
    for column  in columns:
        df = subdf.dropna(subset=[column])
        if len(df) == 0:
            series[str(column)] = np.nan
        else:
            series[str(column)] = np.average( df[column], weights=df['Weights'])

    return series

【问题讨论】:

  • 你能计算出subdf['data'].dropna()的平均值吗?
  • 不,我需要一个加权平均值,如果我执行 dropna(),我会得到:权重长度与...不兼容
  • 为什么你的wavg 中有那个循环?您似乎不想为每列做任何事情;您只计算每个整个组的 一个 组平均值,而不是每列一个。

标签: python numpy pandas weighted-average


【解决方案1】:

由于np.average 本身不处理nan,您必须自己处理它们。最简单的方法是在对它进行任何操作之前将您的 subdf 子集化。在 wavg 的开头添加 subdf = subdf.dropna(subset=['data']) 以删除“数据”列中包含 NaN 的行:

def wavg(subdf):
    series = pd.Series()
    subdf = subdf.dropna(subset=['data'])

    series['np.mean'] = np.mean(subdf['data'])
    series['np.average (no weights)'] = np.average(subdf['data'])
    series['np.average (weighted)'] = np.average(subdf['data'], weights=subdf['Weights'])
    series['np.ma.average (weighted)'] = np.ma.average(subdf['data'], weights=subdf['Weights']) 

    return series

正如我在评论中所建议的,我从wavg 中删除了循环。您只想为每组返回一组平均值(即一个平均值、一个平均值、一个加权平均值、一个掩码平均值)。但是在你的循环中,你要为每个组重新计算四次相同的东西(因为你的 DataFrame 中有四列)。

【讨论】:

  • 谢谢!循环的原因是我想计算原始数据框中所有列的平均值。
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多