代码之家  ›  专栏  ›  技术社区  ›  The Great

Pandas groupby并计算多列中NA值的比率

  •  2
  • The Great  · 技术社区  · 2 年前

    我有一个如下所示的数据框架

    id,status,amount,qty
    1,pass,123,4500
    1,pass,156,3210
    1,fail,687,2137
    1,fail,456,1236
    2,pass,216,324
    2,pass,678,241
    2,nan,637,213
    2,pass,213,543
    
    df = pd.read_clipboard(sep=',')
    

    我想做以下事情

    a) Groupby公司 id 并计算每个id的通过百分比

    b) Groupby公司 id号 然后计算平均值 amount 对于每个id

    因此,我尝试了以下方法

    df['amt_avg'] = df.groupby('id')['amount'].mean()
    df['pass_pct'] = df.groupby('status').apply(lambda x: x['status']/ x['status'].count())
    df['fail_pct'] = df.groupby('status').apply(lambda x: x['status']/ x['status'].count())
    

    但这行不通。

    我很难获得通过率。

    在我的真实数据中,我有很多列,如 status 为此,我必须找到特定值的百分比分布(例如:通过)

    我希望我的输出如下

    id,pass_pct,fail_pct,amt_avg
    1,50,50,2770.75
    2,75,0,330.25
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   jezrael    2 年前

    使用 crosstab 用替换缺少的值 nan 带删除 南安 列,然后添加新列 amt_avg 通过 DataFrame.join :

    s = df.groupby('id')['qty'].mean()
    
    df  = (pd.crosstab(df['id'], df['status'].fillna('nan'), normalize=0)
              .drop('nan', 1)
              .mul(100)
              .join(s.rename('amt_avg')))
    
    print (df)
        fail  pass  amt_avg
    id                     
    1   50.0  50.0  2770.75
    2    0.0  75.0   330.25