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相同?