根据两个条件求平均值;从这些平均值创建列
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
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
我希望这有助于或提供想法,因为一百万行数据是很多数据
我有一个带有天气报告数据的 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
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
我希望这有助于或提供想法,因为一百万行数据是很多数据