簡體   English   中英

熊貓:如何按日期將數據分組在一起,並對分組數據應用多種功能?

[英]Pandas: How do you group data together by date and apply multiple functions to the grouped data?

在我的代碼中,我有一個pandas數據框,其中有一天的列和稱為value的列。 我想按天對數據框進行分組,並找到當天的最小值和最大值,對最小值和最大值進行平均,然后從數據框的值列中減去該平均值。

我最能做的是:

temp_max = var.groupby(['day']).max()
temp_min = var.groupby(['day']).min()

answer = var.groupby(['day'])['value'].apply(lambda x : x - (temp_max['value'] - temp_min['value']) / 2 )

輸入:

    Unnamed: 0  hrs                   vt                   rt      value
0       119899    1  2017-03-01 07:00:00  2017-03-01 06:00:00  67.910011
1       119900    2  2017-03-01 08:00:00  2017-03-01 06:00:00  52.970033
2       119901    3  2017-03-01 09:00:00  2017-03-01 06:00:00  49.010011
3       119902    4  2017-03-01 10:00:00  2017-03-01 06:00:00  47.030000
4       119903    5  2017-03-01 11:00:00  2017-03-01 06:00:00  45.949989
5       119904    6  2017-03-01 12:00:00  2017-03-01 06:00:00  45.949989

輸出:

1    0           NaN
 1     41.540022
 2     31.549989
 3     29.570005
 4     36.949989
 5     38.030000
 6     40.010011
 7     33.980000
 8     47.030000
 9           NaN
 10          NaN
 11          NaN
 12          NaN
 13          NaN
 14          NaN
 15          NaN
 16          NaN
2    1           NaN
     2           NaN
     3           NaN
     4           NaN
     5           NaN
     6           NaN
     7           NaN
     8           NaN
     17          NaN
     18          NaN
     19          NaN
     20          NaN
     21          NaN
             ...    
6    4           NaN
     5           NaN
     6           NaN
     7           NaN
     8           NaN
     53          NaN
     54          NaN
     55          NaN
     56          NaN
7    1           NaN
     2           NaN
     3           NaN
     4           NaN
     5           NaN
     6           NaN
     7           NaN
     8           NaN
     57          NaN
     58          NaN
     59          NaN
     60          NaN
8    1           NaN
     2           NaN
     3           NaN
     4           NaN
     5           NaN
     6           NaN
     7           NaN
     8           NaN
     61          NaN

該值似乎是正確的,但我希望保留原始數據框,並僅將這些值更新到位。 我應該采用其他方法嗎? 提前謝謝!

這樣的事情怎么樣?

new_frame = pd.DataFrame(columns=var.columns)

for day,frame in var.groupby('day'):

    frame.loc[:,'value'] = frame['value'].apply(lambda x: x - (frame.value.max() + frame.value.min())/2)

    new_frame = new_frame.append(frame)

您可以使用列表理解和groupby在一行中完成此操作,但是看起來有點難看

var.loc[:,'value'] = pd.concat([frm.value.apply(lambda x:x-(frm.value.min() + frm.value.max())/2) for d,frm in var.groupby('day')])

我相信,即使不是特別易讀,它也可以完成您想要的工作!

暫無
暫無

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

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