Python 熊猫:如何按日期将数据分组,并对分组的数据应用多个函数?
在我的代码中,我有一个pandas数据框,其中有一列表示日期,另一列称为value。我想按天对数据帧进行分组,找到当天的最小值和最大值,求最小值和最大值的平均值,然后从数据帧中的值列中减去该平均值 我能做的最接近的事情是: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 - (
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