[英]How to sum timedeltas with resample or groupby in Pandas?
[英]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')
按月重新采樣。 分組和重采樣后,我想看兩件事
c
列中有多少個yes
的實例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.