熊猫分组计数,然后按条件均值

时间:2020-02-20 17:12:33

标签: python pandas pandas-groupby

我有一个这样的数据框:

    col1 col2
0    a   100
1    a   200
2    a   150
3    b   1000
4    c   400
5    c   200

我要做的是对col1进行分组并计算出现的次数,如果count等于或大于2,则计算这些行的col2平均值,如果不返回null。输出应为:

    col1 mean
0    a   150
1    b   
2    c   300

4 个答案:

答案 0 :(得分:4)

groupby.mean + DataFrame.whereSeries.value_counts一起使用:

df.groupby('col1').mean().where(df['col1'].value_counts().ge(2)).reset_index()

#you can select columns you want
#(df.groupby('col1')[['col2']]
#   .mean()
#   .where(df['col1'].value_counts().ge(2)).reset_index())

输出

  col1   col2
0    a  150.0
1    b    NaN
2    c  300.0

如果您真的想要空白:

df.groupby('col1').mean().where(df['col1'].value_counts().ge(2), '').reset_index()

  col1 col2
0    a  150
1    b     
2    c  300

答案 1 :(得分:2)

自定义agg函数

df.groupby('col1').agg(lambda d: np.nan if len(d) == 1 else d.mean())

       col2
col1       
a     150.0
b       NaN
c     300.0

答案 2 :(得分:1)

df.groupby('col1')['col2'].apply(lambda x: x.mean() if x.count() >= 2 else np.nan)


col1
a    150.0
b      NaN
c    300.0

编辑:

%timeit df.groupby('col1')['col2'].apply(lambda x: x.mean() if x.count() >= 2 else np.nan)
2.36 ms ± 255 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# piRSquared
%timeit df.groupby('col1').agg(lambda d: np.nan if len(d) == 1 else d.mean())
5.9 ms ± 30 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# ansev
%timeit df.groupby('col1').mean().where(df['col1'].value_counts().ge(2)).reset_index()
7.01 ms ± 23.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

答案 3 :(得分:1)

我会选择GroupBymask

g = df.groupby('col1')
g.mean().mask(g.size().eq(1))

      col2
col1       
a     150.0
b       NaN
c     300.0