[英]pandas groupby count and then conditional mean
我有一個這樣的數據框:
col1 col2
0 a 100
1 a 200
2 a 150
3 b 1000
4 c 400
5 c 200
我想要做的是按 col1 分組並計算出現次數,如果計數等於或大於 2,則計算這些行的 col2 的平均值,如果不是則返回 null。 輸出應該是:
col1 mean
0 a 150
1 b
2 c 300
使用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
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
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)
我會選擇GroupBy
和mask
:
g = df.groupby('col1')
g.mean().mask(g.size().eq(1))
col2
col1
a 150.0
b NaN
c 300.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.