Как изменить значения в фрейме данных на значения из другого фрейма с наиболее близким соответствием? - PullRequest
1 голос
/ 02 мая 2019

У меня есть датафрейм с параметрами объекта недвижимости («Комнаты», «Площадь» и т. Д.). Я хочу заменить строки, в которых параметр «Комнаты» равен 0, на соответствующее количество комнат из фрейма данных («Комнаты» - «средняя площадь»), который я создал из того же начального набора данных.

Я бы использовал метод .replace, но проблема в том, что фактические значения Square для 0 строк комнаты не совсем соответствуют средним значениям.

Я новичок в pandas, поэтому все решения, которые я бы попробовал, основаны на помещении значений столбцов в списки 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 кв. М. Ближе всего к ~ 122 кв. В среднем для 4 комнат).

1 Ответ

2 голосов
/ 02 мая 2019

Это 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...