Python 按多列分组并执行自定义聚合
下面给出了一个数据帧示例Python 按多列分组并执行自定义聚合,python,pandas,Python,Pandas,下面给出了一个数据帧示例 hour minute value 0 0 10 0 5 20 0 10 30 0 15 50 0 20 10 0 25 55 1 0 55 1 5 50 1 10 10 1 15 20 1 20 30 1 25 40
hour minute value
0 0 10
0 5 20
0 10 30
0 15 50
0 20 10
0 25 55
1 0 55
1 5 50
1 10 10
1 15 20
1 20 30
1 25 40
1 30 50
。。。。每天每小时都这样。我想取每小时和每分钟的平均值,stdev,乘以每小时和每分钟的实际值,作为两个新列。最后的数据帧如下所示
因此,对于0小时和0分钟,平均值是平均值(10,55)和标准偏差(10,55)
0小时和0分钟的新列的值将是平均值(10,55)*10和标准偏差(10,55)*10
1小时和0分钟的新列的值为
平均值(10,55)*55和标准偏差(10,55)*55
同样,它需要迭代所有小时和分钟并聚合
hour minute value mean*value stdev*value
0 0 10 325 318
0 5 20 700 424
1 0 55 1787 1750
1 5 50 1750 1060
目前,我正在对行进行迭代,先按小时迭代,然后按分钟迭代,并计算每个行的增值
for hour in df.hour:
for minute in df.minute:
trim_df = df.loc[(df[hour] == hour) & (df[minute] == minute)]
mean = trim_df [value].mean()
stdev = trim_df [value].std()
for index,row in trim_df.iterrows():
df.at[index, "mean*value"] = row["value"]*mean
df.at[index, "stdev*value"] = row["value"]*stdev
我的方法花费了大量时间。我正在尝试使用pandas group by feature,但无法转换此逻辑。您可以使用
df.groupby(…).transform('mean')
返回一个包含每个组平均值的序列:
import pandas as pdf
df = pd.DataFrame(columns = ['hour', 'minute', 'value'], data =
[[ 0, 0, 10],
[0, 5, 20],
[0, 10, 30],
[ 0, 15, 50],
[0, 20, 10],
[0, 25, 55],
[1, 0, 55],
[1, 5, 50],
[1, 10, 10],
[1, 15, 20],
[1, 20, 30],
[1, 25, 40],
[1, 30, 50]])
df['mean_value'] = df.groupby(['minute'])['value'].transform('mean')*df.value
df
=> hour minute value mean_value
0 0 0 10 325.0
1 0 5 20 700.0
2 0 10 30 600.0
3 0 15 50 1750.0
4 0 20 10 200.0
5 0 25 55 2612.5
6 1 0 55 1787.5
7 1 5 50 1750.0
8 1 10 10 200.0
9 1 15 20 700.0
10 1 20 30 600.0
11 1 25 40 1900.0
12 1 30 50 2500.0
对
.transform('std')
执行同样的操作以获得标准偏差序列。您可以使用df.groupby(…).transform('mean')
返回一个包含每组平均值的序列:
import pandas as pdf
df = pd.DataFrame(columns = ['hour', 'minute', 'value'], data =
[[ 0, 0, 10],
[0, 5, 20],
[0, 10, 30],
[ 0, 15, 50],
[0, 20, 10],
[0, 25, 55],
[1, 0, 55],
[1, 5, 50],
[1, 10, 10],
[1, 15, 20],
[1, 20, 30],
[1, 25, 40],
[1, 30, 50]])
df['mean_value'] = df.groupby(['minute'])['value'].transform('mean')*df.value
df
=> hour minute value mean_value
0 0 0 10 325.0
1 0 5 20 700.0
2 0 10 30 600.0
3 0 15 50 1750.0
4 0 20 10 200.0
5 0 25 55 2612.5
6 1 0 55 1787.5
7 1 5 50 1750.0
8 1 10 10 200.0
9 1 15 20 700.0
10 1 20 30 600.0
11 1 25 40 1900.0
12 1 30 50 2500.0
对
.transform('std')
执行相同的操作,以获得标准偏差序列。您能展示一下您对groupby所做的操作吗?你应该可以和groupby一起做这件事,我是熊猫集团的新手by@D14我不确定我是否理解-您的初始数据帧在(小时、分钟)对上已经是唯一的。你将如何用小时的平均值乘以小时的值-在你的示例中,小时0有6个可能的值,你如何选择使用哪一个值?@Stael是正确的,你想要小时的平均值还是分钟的平均值?我只给出了2小时的实际数据帧是24小时的,因此每0,5分钟就会有24个值。这24个值的平均值,然后乘以这些分钟的实际值。希望我能澄清你能展示一下你对groupby做了什么吗?你应该可以和groupby一起做这件事,我是熊猫集团的新手by@D14我不确定我是否理解-您的初始数据帧在(小时、分钟)对上已经是唯一的。你将如何用小时的平均值乘以小时的值-在你的示例中,小时0有6个可能的值,你如何选择使用哪一个值?@Stael是正确的,你想要小时的平均值还是分钟的平均值?我只给出了2小时的实际数据帧是24小时的,因此每0,5分钟就会有24个值。这24个值的平均值,然后乘以这些分钟的实际值。希望我能澄清我的建议,但本质上是一样的。@TMrtSmith不可能有一个可用于的自定义函数吗transform@stael-别想。agg给出了一个与原始df长度相同的序列?我想建议,但本质上是一样的。@TMrtSmith不可能有一个自定义的吗可与一起使用的函数transform@stael-别想。agg给出的序列长度与原始df相同?