簡體   English   中英

具有靈活聚合周期的按熊貓數據框分組的平均值

[英]Mean of a grouped-by pandas dataframe with flexible aggregation period

這里,我需要計算值 ==1 和值 = 0 的行的列持續時間和公里的平均值。這次我希望聚合周期是靈活的。

df
Out[20]: 
                          Date duration km   value
0   2015-03-28 09:07:00.800001    0      0    0
1   2015-03-28 09:36:01.819998    1      2    1
2   2015-03-30 09:36:06.839997    1      3    1 
3   2015-03-30 09:37:27.659997    nan    5    0 
4   2015-04-22 09:51:40.440003    3      7    0
5   2015-04-23 10:15:25.080002    0      nan  1

對於 1 天的聚合期,我可以使用之前建議的解決方案:

df.pivot_table(values=['duration','km'],columns=['value'],index=df['Date'].dt.date,aggfunc='mean'

ndf.columns = [i[0]+str(i[1]) for i in ndf.columns]

            duration0  duration1  km0  km1
Date                                      
2015-03-28        0.0        1.0  0.0  2.0
2015-03-30        NaN        1.0  5.0  3.0
2015-04-22        3.0        NaN  7.0  NaN
2015-04-23        NaN        0.0  NaN  NaN

但是,我不知道如何更改聚合周期以防萬一,例如,我想將它作為函數的參數傳遞......因此,使用pd.Grouper(freq=freq_aggregation)freq_aggregation = 'd''60s'將是首選...

讓我們用pd.Grouperunstack ,和列映射:

freq_str = '60s'
df_out = df.groupby([pd.Grouper(freq=freq_str, key='Date'),'value'])['duration','km'].agg('mean').unstack()

df_out.columns = df_out.columns.map('{0[0]}{0[1]}'.format)

df_out

輸出:

                     duration0  duration1  km0  km1
Date                                               
2015-03-28 09:07:00        0.0        NaN  0.0  NaN
2015-03-28 09:36:00        NaN        1.0  NaN  2.0
2015-03-30 09:36:00        NaN        1.0  NaN  3.0
2015-03-30 09:37:00        NaN        NaN  5.0  NaN
2015-04-22 09:51:00        3.0        NaN  7.0  NaN
2015-04-23 10:15:00        NaN        0.0  NaN  NaN

現在,讓我們將 freq_str 更改為 'D':

freq_str = 'D'
df_out = df.groupby([pd.Grouper(freq=freq_str, key='Date'),'value'])['duration','km'].agg('mean').unstack()

df_out.columns = df_out.columns.map('{0[0]}{0[1]}'.format)

print(df_out)

輸出:

            duration0  duration1  km0  km1
Date                                      
2015-03-28        0.0        1.0  0.0  2.0
2015-03-30        NaN        1.0  5.0  3.0
2015-04-22        3.0        NaN  7.0  NaN
2015-04-23        NaN        0.0  NaN  NaN

您可以將 grouper 傳遞給數據透視表的索引。 希望這是你正在尋找的東西,即

ndf = df.pivot_table(values=['duration','km'],columns=['value'],index=pd.Grouper(key='Date', freq='60s'),aggfunc='mean')
ndf.columns = [i[0]+str(i[1]) for i in ndf.columns]

輸出:

duration0  duration1  km0  km1
Date                                               
2015-03-28 09:07:00        0.0        NaN  0.0  NaN
2015-03-28 09:36:00        NaN        1.0  NaN  2.0
2015-03-30 09:36:00        NaN        1.0  NaN  3.0
2015-03-30 09:37:00        NaN        NaN  5.0  NaN
2015-04-22 09:51:00        3.0        NaN  7.0  NaN
2015-04-23 10:15:00        NaN        0.0  NaN  NaN

如果頻率是D那么

duration0  duration1  km0  km1
Date                                      
2015-03-28        0.0        1.0  0.0  2.0
2015-03-30        NaN        1.0  5.0  3.0
2015-04-22        3.0        NaN  7.0  NaN
2015-04-23        NaN        0.0  NaN  NaN

使用 groupby

df = df.set_index('Date')    
df.groupby([pd.TimeGrouper('D'), 'value']).mean()

                 duration   km
Date       value               
2017-10-11 0      1.500000  4.0
           1      0.666667  2.5


df.groupby([pd.TimeGrouper('60s'), 'value']).mean()

                           duration   km
Date                value               
2017-10-11 09:07:00 0      0.0       0.0
2017-10-11 09:36:00 1      1.0       2.5
2017-10-11 09:37:00 0     NaN        5.0
2017-10-11 09:51:00 0      3.0       7.0
2017-10-11 10:15:00 1      0.0      NaN 

如果你想把它拆開,那就拆開它。

df.groupby([pd.TimeGrouper('D'), 'value']).mean().unstack()

           duration        km     
value             0    1    0    1
Date                              
2017-10-11 1.50     0.67 4.00 2.50

暫無
暫無

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

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