我有一个带有房地产对象参数(“房间”,“正方形”等)的数据框。我想将“ 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平方米均值)。
答案 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