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

2024-04-24 15:20:17 发布

您现在位置:Python中文网/ 问答频道 /正文

下面给出了一个数据帧示例。在

   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)和标准偏差(10,55) 0小时和0分钟的新列的值为平均值(10,55)*10&stdev(10,55)*10 新列1小时0分钟的值为 平均值(10,55)*55和标准偏差(10,55)*55 同样的方式,它需要迭代所有的小时和分钟和聚合

^{pr2}$

目前,我正在对行进行迭代,先按小时,然后按分钟,并对每行进行增值计算。在

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按功能分组,但无法转换这种逻辑。在


Tags: 数据indfforindexvaluemeanrow
1条回答
网友
1楼 · 发布于 2024-04-24 15:20:17

您可以使用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')执行相同的操作以获得标准偏差系列。在

相关问题 更多 >