簡體   English   中英

熊貓分組計數,然后條件平均

[英]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.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

自定義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)

我會選擇GroupBymask

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM