Python 熊猫:如何按日期将数据分组,并对分组的数据应用多个函数?

Python 熊猫:如何按日期将数据分组,并对分组的数据应用多个函数?,python,pandas,Python,Pandas,在我的代码中,我有一个pandas数据框,其中有一列表示日期,另一列称为value。我想按天对数据帧进行分组,找到当天的最小值和最大值,求最小值和最大值的平均值,然后从数据帧中的值列中减去该平均值 我能做的最接近的事情是: temp_max = var.groupby(['day']).max() temp_min = var.groupby(['day']).min() answer = var.groupby(['day'])['value'].apply(lambda x : x - (

在我的代码中,我有一个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
输出:

    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')])

我相信这会完成你想做的事情,尽管不是特别可读

这很好,因为它允许我跳过前两行代码,但我仍然不确定如何将这些值的平均值干净地应用到var dataframe的['value']列。对不起,请快速阅读您的问题-lambda能解决您的问题吗?完全可以理解,但是看起来你不能那样使用agg函数。我收到一个“raise Exception(‘必须生成聚合值’)”错误。你是对的,我明白为什么,也许这不能在一行中完成-但是看看我的最新编辑。你能显示一个输入示例吗?我的错!我将输入添加到OP