【问题标题】:Weighted Means for columns in Pandas DataFrame including NanPandas DataFrame 中列的加权平均值,包括 Nan
【发布时间】:2017-08-17 18:51:13
【问题描述】:

我正在尝试获取 Pandas.Dataframe 的每一列 (A-F) 的加权平均值,其中“值”作为权重。我只能找到类别问题的解决方案,这不是我需要的。

正常均值的可比较解决方案是

df.means()

请注意,df 在列和“值”中有 Nan。

   A      B         C      D      E      F    Value
0  17656  61496     83     80    117     99   2902804
1  75078  61179     14      3      6     14   3761964
2  21316  60648     86    Nan    107     93   127963
3  6422   48468  28855  26838  27319  27011   131354
4  12378  42973  47153  46062  46634  42689   3303909572
5  54292  35896     59      6      3     18   27666367
6  21272  Nan      126     12      3      5   9618047
7  26434  35787    113     17      4      8   309943
8  10508  34314  34197   7100     10     10   NaN

我可以将它用于单个列。

df1 = df[['A','Value']]
df1 = df1.dropna()
np.average(df1['A'], weights=df1['Value'])

必须有一个简单的方法。这让我发疯了,我没看到。

我将不胜感激。

【问题讨论】:

    标签: python pandas numpy dataframe weighted-average


    【解决方案1】:

    您可以使用掩码数组。我们可以丢弃 Value 列具有 NaN 值的行。

    In [353]: dff = df.dropna(subset=['Value'])
    
    In [354]: dff.apply(lambda x: np.ma.average(
                        np.ma.MaskedArray(x, mask=np.isnan(x)), weights=dff.Value))
    Out[354]:
    A        1.282629e+04
    B        4.295120e+04
    C        4.652817e+04
    D        4.545254e+04
    E        4.601520e+04
    F        4.212276e+04
    Value    3.260246e+09
    dtype: float64
    

    【讨论】:

    • 效果很好,我以前从未使用过 MaskedArray。
    • 我很好奇。如果没有丢失数据,你将如何解决这个问题?
    • 如果没有缺失数据可以直接df.apply(lambda x: np.average(x, weights=df.Value))?
    • 再次感谢您!
    猜你喜欢
    • 2013-09-12
    • 2016-01-08
    • 1970-01-01
    • 2019-08-29
    • 2016-05-23
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多