簡體   English   中英

重采樣和分組,均值和總和

[英]resample and groupby, mean and sum

這是我的輸入 dataframe

d1 = pd.Timestamp(2020,8,1)
d2 = pd.Timestamp(2020,9,1)
somedict = {'a':[2,3,2,3,4], 'b':['one','two','two','two','one'], 'c':['yes','no','yes','yes','no'] ,'d':[d1,d1,d2,d1,d2], 'e':[8,7,7,6,9]}
df = pd.DataFrame(somedict)
df.set_index('d',inplace=True)

我想使用df.groupby('b')b列對它進行分組,並使用df.resample('M')按月重新采樣。 分組和重采樣后,我想看兩件事

  1. 我們在c列中有多少個yes的實例
  2. a列的總和除以e列的總和

因此,生成的 output 應按b列中的類別one, two分組,並且應每月顯示實例的總和/數量

我嘗試運行(df['c'] == 'yes').resample('M').mean()幾乎可以回答問題 1,但由於b不再是結果的一部分,我可以'不要寫groupby('b')

嘗試使用pd.Grouper

groups = df.groupby(['b',pd.Grouper(freq='M')])

out = pd.DataFrame({'count_c': groups['c'].apply(lambda x: x.eq('yes').sum()),
                    'a/e': groups['a'].sum()/groups['e'].sum()
                   })

Output:

                count_c       a/e
b   d                            
one 2020-08-31        1  0.250000
    2020-09-30        0  0.444444
two 2020-08-31        1  0.461538
    2020-09-30        1  0.285714

或者,您可以繞過apply function 並使用 pipe 代替(速度略有增加):

(df.assign(c=lambda df: df['c'].map({"yes":1,"no":0}))
   .groupby(['b', pd.Grouper(freq='M')])
   .pipe(lambda df: pd.DataFrame({"count_c": df['c'].sum(), 
                                  "a/e": df['a'].sum()/df['e'].sum()}))
 )
 
                count_c       a/e
b   d                            
one 2020-08-31        1  0.250000
    2020-09-30        0  0.444444
two 2020-08-31        1  0.461538
    2020-09-30        1  0.285714

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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