我有一个包含天气报告数据的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列。我希望它们针对每个MONTH的每个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
答案 0 :(得分:2)
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
答案 1 :(得分:2)
我认为,如果您有数百万行数据,因为这些分组可能会重复(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
我希望这种帮助或提出想法,因为一百万行数据是很多数据