我有一个目标表,其中有两种类型的类别:stationID和Month。我需要对照另一个参考表的值来标准化该表的温度值(通过匹配stationID)。用大熊猫做这件事的最好方法是什么?
例如:
参考表:其中包含唯一测站的均值和标准差参考值
stationID | Temp_mean | Temp_std |...
----------+-------------+----------+
A | 30.0 | 3.4 |
B | 31.1 | 4.5 |
C | 24.5 | 0.2 |
...
目标表:其中包含每个电台和月份的原始数据
stationID | Mon | Temperature |...
----------+------+-------------+
A | 1 | 30.1 |
A | 2 | 31.2 |
A | 3 | 24.0 |
B | 1 | 30.3 |
C | 2 | 20.4 |
C | 1 | 24.3 |
C | 2 | 25.4 |
...
因此,从目标表中的温度值中,我需要减去平均值并除以参考表的标准偏差。
到目前为止,我的代码是
df['Temperature_Stdized']=df(['stationID','Mon'])['Temperature'].transform(lambda x: (x - x.mean()) / x.std())
但是,我不想使用“ x”中的均值和标准差,而是希望通过匹配stationID值来使用参考表中的值。
感谢您的帮助。谢谢。
答案 0 :(得分:3)
考虑将您的Reference Table
设为ref
,将Target Table
设为tar
,您可以这样做:
tar['Temprature'] = (ref.merge(tar, on = 'stationID')
.eval('(Temperature - Temp_mean) / Temp_std'))
stationID Mon Temperature
0 A 1 0.029412
1 A 2 0.352941
2 A 3 -1.764706
3 B 1 -0.177778
4 C 2 -20.500000
5 C 1 -1.000000
6 C 2 4.500000
详细信息
第一步是stationID
上两个数据帧的merge
:
x = ref.merge(tar, on = 'stationID')
print(x)
stationID Temp_mean Temp_std Mon Temperature
0 A 30.0 3.4 1 30.1
1 A 30.0 3.4 2 31.2
2 A 30.0 3.4 3 24.0
3 B 31.1 4.5 1 30.3
4 C 24.5 0.2 2 20.4
5 C 24.5 0.2 1 24.3
6 C 24.5 0.2 2 25.4
,然后用以下表达式eval
来规范每一行:
x.eval('(Temperature - Temp_mean) / Temp_std')
0 0.029412
1 0.352941
2 -1.764706
3 -0.177778
4 -20.500000
5 -1.000000
6 4.500000
dtype: float64