如何计算熊猫数据框中不同大小的子集的均值?

问题描述 投票:2回答:3

pandas数据框中行的每个唯一子集的特定列的均值计算。在以下示例中,每个子集直到1出现在“标记”列中,即(54 + 34 + 78 + 91 + 29)/ 5 = 57.2和(81 + 44 + 61)/ 3 = 62.0

当前无法根据特定的列条件来计算不同大小的滚动子集


>>> import pandas as pd
>>> df = pd.DataFrame({"Indx": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], "Units": [54, 34, 78, 91, 29, 81, 44, 61, 73, 19], "Flag": [0, 0, 0, 0, 1, 0, 0, 1, 0, 1]})
>>> df
   Indx  Units  Flag
0     1     54     0
1     2     34     0
2     3     78     0
3     4     91     0
4     5     29     1
5     6     81     0
6     7     44     0
7     8     61     1
8     9     73     0
9    10     19     1

# DESIRED OUTPUT
>>> df
   Indx  Units  Flag   avg
0     1     54     0  57.2
1     2     34     0  57.2
2     3     78     0  57.2
3     4     91     0  57.2
4     5     29     1  57.2
5     6     81     0  62.0
6     7     44     0  62.0
7     8     61     1  62.0
8     9     73     0  46.0
9    10     19     0  46.0
pandas dataframe subset mean
3个回答
1
投票

使用cumsum然后按transform创建组密钥

df['Units'].groupby(df.Flag.iloc[::-1].cumsum()).transform('mean')
0    57.2
1    57.2
2    57.2
3    57.2
4    57.2
5    62.0
6    62.0
7    62.0
8    46.0
9    46.0
Name: Units, dtype: float64

#df['new']=df['Units'].groupby(df.Flag.iloc[::-1].cumsum()).transform('mean')

0
投票

使用Series.cumsum + Series.cumsum使用Series.shift创建组,然后使用Series.shift计算均值:

groupby

详细信息:

groupby

0
投票

最短的解决方案(我认为)是:

transform

您甚至不需要使用iloc,因为df.Flag [::-1]检索Flag列以相反的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.