【问题标题】:Calculate grouped average of columns in pandas dataframe for non zero elements based on time根据时间计算非零元素的熊猫数据框中列的分组平均值
【发布时间】:2022-01-25 14:31:20
【问题描述】:

您好,我想计算每个名称组在每个时间的平均天数列。每个组的每个时间的平均值应仅基于大于 0 的 Days 行的元素计算。任何反馈将不胜感激..

Name       Time        Days    Average
 
John    2021-12-02      0        0
John    2021-12-03      2        0 
John    2021-12-05      9        2
John    2021-12-07      0       5.5
John    2021-12-10     10       5.5
Larry   2021-12-02     20        0
Jim     2021-12-09     20        0
Jim     2021-12-10     20       20
Jim     2021-12-12     40       20
Jim     2021-12-12      0       26.6
Juli    2021-11-09      0        0
Juli    2021-11-10      0        0
Juli    2021-11-12     40        0
Juli    2021-11-18      0       40
Juli    2021-11-12      0       40
Juli    2021-11-18      2       40
Juli    2021-11-19      0       21

【问题讨论】:

  • 请分享数据框创建者代码

标签: python pandas datetime pandas-groupby


【解决方案1】:

首先将0 替换为缺失值,然后将GroupBy.transformSeries.expanding 的lambda 函数与meanSeries.shift 一起使用,最后将NaNs 替换为0Series.fillna

df['Avg'] = (df.assign(Days = df['Days'].replace(0,np.nan))
               .groupby('Name')['Days']
               .transform(lambda x: x.expanding().mean().shift())
               .fillna(0))
print (df)
     Name        Time  Days  Average        Avg
0    John  2021-12-02     0      0.0   0.000000
1    John  2021-12-03     2      0.0   0.000000
2    John  2021-12-05     9      2.0   2.000000
3    John  2021-12-07     0      5.5   5.500000
4    John  2021-12-10    10      5.5   5.500000
5   Larry  2021-12-02    20      0.0   0.000000
6     Jim  2021-12-09    20      0.0   0.000000
7     Jim  2021-12-10    20     20.0  20.000000
8     Jim  2021-12-12    40     20.0  20.000000
9     Jim  2021-12-12     0     26.6  26.666667
10   Juli  2021-11-09     0      0.0   0.000000
11   Juli  2021-11-10     0      0.0   0.000000
12   Juli  2021-11-12    40      0.0   0.000000
13   Juli  2021-11-18     0     40.0  40.000000
14   Juli  2021-11-12     0     40.0  40.000000
15   Juli  2021-11-18     2     40.0  40.000000
16   Juli  2021-11-19     0     21.0  21.000000

【讨论】:

  • 我希望计算平均值时只考虑非零天数元素提供的解决方案使用所有元素来计算每个组的平均值,这不是我想做的,即行4 for John 使用第 0、1、2 和 3 行我只想使用非零天元素第 1 行和第 2 行的元素,而不是第 0 行和第 3 行
  • @konrac - 是的,因为它被替换为0np.nan,然后不使用行0,3,因为被缺失值填充。所以不确定是否了解问题所在。