Pandas / Python:Groupby并根据参考表进行转换

时间:2019-01-09 18:51:54

标签: python pandas

我有一个目标表,其中有两种类型的类别: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值来使用参考表中的值。

感谢您的帮助。谢谢。

1 个答案:

答案 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