【问题标题】:Pandas Dataframe, average non 0 valuePandas Dataframe,平均非 0 值
【发布时间】:2021-05-05 18:44:35
【问题描述】:

我有以下 Pandas Dataframe 'df':

a1  a2  a3  b1
0   0   0   1
1   2   0   2
3   0   0   3
2   4   0   4

如何从a1、a2、a3中得到“a”的平均值,忽略0值?

a1  a2  a3  b1  avg(a)
0   0   0   1   0
1   2   0   2   1.5
3   0   0   3   3.0
2   4   0   4   3.0

我坚持使用手动方法,将值 > 0 转换为 1

【问题讨论】:

    标签: python pandas dataframe jupyter-notebook google-colaboratory


    【解决方案1】:

    你可以.filtera喜欢列,然后.mask这些列中的零,然后.meanaxis=1一起取:

    a = df.filter(like='a')
    df['avg'] = a.mask(a.eq(0)).mean(1).fillna(0)
    
    # OR df['avg'] = a[a > 0].mean(1).fillna(0)
    

       a1  a2  a3  b1  avg
    0   0   0   0   1  0.0
    1   1   2   0   2  1.5
    2   3   0   0   3  3.0
    3   2   4   0   4  3.0
    

    【讨论】:

    • 谢谢,如果我有很多平均,这现在可以工作,例如 a1 a2 a3, b1 b2 b3 我只需要为这些列创建变量
    • @ngakanalit 你能详细说明一下吗?您是否需要平均所有 a's 列然后是所有 b 的列?
    【解决方案2】:
    import pandas as pd
    
    df = pd.DataFrame({'a1': [0, 1, 3, 2],
                       'a2': [0, 2, 0, 4],
                       'a3': [0, 0, 0, 0],
                       'b1': [1, 2, 3, 4]})
    
    # remove the last column
    df1 = df.drop('b1', 1)
    
    # counting non-zeros
    df2 = df1.astype(bool).sum(axis=1)
    
    # sum and divide
    df3 = df1.sum(axis=1) / df2
    df['avg(a)'] = df3.fillna(0)
    print(df)
    
    
       a1  a2  a3  b1  avg(a)
    0   0   0   0   1     0.0
    1   1   2   0   2     1.5
    2   3   0   0   3     3.0
    3   2   4   0   4     3.0
    

    【讨论】:

    • 在某些情况下这种方法会很方便,但上面的解决方案要简单得多,谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 2016-01-08
    • 1970-01-01
    • 2013-09-12
    • 2023-03-10
    • 2019-01-22
    相关资源
    最近更新 更多