按多列分组并执行自定义聚合

时间:2017-07-11 14:30:00

标签: 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
   1    30     50

....像这样每天一小时。我想采取每小时的平均值,每小时和每个最小值的多次,每个小时的实际值和最小值作为两个新列。所以最终的数据框如下所示。

所以0小时& 0分钟,平均值是平均值(10,55)& STDEV(10,55)  0小时和0分钟的新列的值将是平均值(10,55)* 10& STDEV(10,55)* 10 并且1小时0分钟的新列值将是  平均值(10,55)* 55& STDEV(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但不能转换这个逻辑。

1 个答案:

答案 0 :(得分:2)

您可以使用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')做同样的事情来获得标准差系列。