我有一个这样的数据框:
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
答案 0 :(得分:4)
将groupby.mean
+ DataFrame.where
与Series.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)
我会选择GroupBy
和mask
:
g = df.groupby('col1')
g.mean().mask(g.size().eq(1))
col2
col1
a 150.0
b NaN
c 300.0