【问题标题】:Group by multiple column and perform custom aggregation按多列分组并执行自定义聚合
【发布时间】:2017-07-11 23:05:28
【问题描述】:

我有一个下面给出的数据框示例。

   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 分钟,平均值是 mean(10,55) & stdev(10,55) 0 小时和 0 分钟的新列的值将是 mean(10,55)*10 & stdev(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,但无法转换此逻辑。

【问题讨论】:

  • 你能展示一下你用 groupby 做了什么吗?您应该可以使用 groupby 和 transform 来做到这一点
  • 没什么具体的我是熊猫组的新手
  • @D14 我不确定我是否理解 - 您的初始数据帧在(小时,分钟)对上已经是唯一的。您将如何将它们的平均值乘以该小时的值 - 在您的示例中,0 小时有 6 个可能的值,您将如何选择使用哪一个?
  • @Stael 是对的,你想要一小时的平均值还是一分钟的平均值?
  • 我只给出了 2 小时的实际数据帧是 24 小时,因此每 0.5 分钟会有 24 个值。这 24 个值的平均意志,然后与这些分钟的实际相乘。希望我能澄清

标签: python pandas


【解决方案1】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多