如何将一个数据帧中的值更改为另一个数据帧中具有最接近匹配的值?

时间:2019-05-02 18:10:39

标签: python-3.x pandas dataframe

我有一个带有房地产对象参数(“房间”,“正方形”等)的数据框。我想将“ Rooms”参数等于0的行替换为我从同一初始数据集创建的(“ Rooms”-“ mean Square”)数据框中的相应房间数。

我会使用.replace方法,但问题是-0个房间行的实际Square值与平均值不完全匹配。

我是熊猫的新手,所以我尝试的所有解决方案都基于将列值放入python列表并使用循环,这是一场噩梦。我在stackoverflow上看到的所有其他类似主题仅适用于完全匹配。

这是我要更改值(“房间”)的初始数据帧的切片和一部分:

data.loc [data ['Rooms'] == 0] [['Rooms','Square']]

      Rooms Square
1397  0.0   138.427694
1981  0.0   212.932361
2269  0.0   41.790881
3911  0.0   49.483501
4366  0.0   81.491446
4853  0.0   2.377248
6149  0.0   38.697117
8834  0.0   87.762616

这是创建“房间”-“均方”数据框的代码:

mean_square = data.loc [(data ['Rooms'] <6)&(data ['Rooms']> 0)]。groupby('Rooms,as_index = False)['Square']。mean( )

这是结果:

    Rooms   Square
0   1.0     41.323277
1   2.0     56.788214
2   3.0     76.903234
3   4.0     98.377544
4   5.0     122.614941

例如,对于项目1397,我希望将0.0更改为5.0(〜138平方米最接近于4个房间的〜122平方米均值)。

1 个答案:

答案 0 :(得分:2)

这是pd.merge_asof。以您的第一个切片为df1,第二个切片为df2,我们可以找到最接近的匹配项'Rooms_y',然后将结果与原始索引对齐。

import pandas as pd

df1['Rooms'] = (pd.merge_asof(df1.reset_index().sort_values('Square'), 
                              df2.sort_values('Square'), 
                              on='Square', direction='nearest')
                   .set_index('index')['Rooms_y']
                )

输出:

      Rooms      Square
1397    5.0  138.427694
1981    5.0  212.932361
2269    1.0   41.790881
3911    2.0   49.483501
4366    3.0   81.491446
4853    1.0    2.377248
6149    1.0   38.697117
8834    4.0   87.762616