根据两个条件求平均值;从这些平均值创建列

Find average based upon two conditions; create column from these averages

我有一个带有天气报告数据的 df。它有超过 200 万行和以下列。

ID  MONTH  TEMP   
1   1      0      
1   1      10     

2   1      50     
2   1      60     

3   1      80    
3   1      90     

1   2      0      
1   2      10     

2   2      50     
2   2      60     

3   2      80     
3   2      90     

我想为月平均温度创建一个列。我需要一种比 for 循环更快的方法。月平均温度值来自 TEMP 列。我希望它们针对每个月的每个 ID。

ID  MONTH  TEMP   AVE MONTHLY TEMP
1   1      0      5
1   1      10     5

2   1      50     55
2   1      60     55

3   1      80     85
3   1      90     85

1   2      0      5
1   2      10     5

2   2      50     55
2   2      60     55

3   2      80     85
3   2      90     85

使用groupby.transform:

df['AVE MONTHLY TEMP']=df.groupby(['ID','MONTH'])['TEMP'].transform('mean')
print(df)

输出

    ID  MONTH  TEMP  AVE MONTHLY TEMP
0    1      1     0                 5
1    1      1    10                 5
2    2      1    50                55
3    2      1    60                55
4    3      1    80                85
5    3      1    90                85
6    1      2     0                 5
7    1      2    10                 5
8    2      2    50                55
9    2      2    60                55
10   3      2    80                85
11   3      2    90                85

我认为如果您有数百万行数据,因为这些分组可能会重复(ID、MONTH),此解决方案可能会更好。这假设 ID 系列始终按照您在数据中的分组方式进行分组。正如您所说,您有一百万行数据,我正在尝试跳出框框思考:

df['AVG MONTHLY TEMP'] = df.groupby(df['ID'].ne(df['ID'].shift()).cumsum(), as_index=False)['TEMP'].transform('mean') 

此外,如果平均温度 ALWAYS 分成两部分,您也可以使用此公式:

df.groupby(np.arange(len(df))//2)['TEMP'].transform('mean')

输出:

    ID  MONTH  TEMP  AVG MONTHLY TEMP
0    1      1     0                 5
1    1      1    10                 5
2    2      1    50                55
3    2      1    60                55
4    3      1    80                85
5    3      1    90                85
6    1      2     0                 5
7    1      2    10                 5
8    2      2    50                55
9    2      2    60                55
10   3      2    80                85
11   3      2    90                85

我希望这有助于或提供想法,因为一百万行数据是很多数据