Вычислить значения в новом столбце данных, используя поиск значений в отдельном кадре, используя python - PullRequest
1 голос
/ 03 марта 2020

(Заранее извините, я новичок в стеке, и это мой первый вопрос)

У меня есть два кадра данных, один из которых содержит цены на жилье для разных объектов, ppd_df:

     price_paid deed_date     postcode  property_type   norm_price
2    36250      2015-11-16    BA1 1JU   F   
3    48000      2015-11-25    BA2 0HB   S   
4    60000      2017-08-31    BA1 4NB   F
... ... ... ... ... ...
8960 4025000    2015-07-16    BA1 2EU   T

И, кадр данных поиска средних цен для каждого типа свойства в каждом месяце, ave_df:

    D_price S_price T_price F_price price_date  month_end
0   459471  285234  247582  208652  2015-01-01  2015-01-31
1   450617  279424  242798  205163  2015-02-01  2015-02-28
2   444885  275747  239328  202948  2015-03-01  2015-03-31
3   443513  274575  238553  201615  2015-04-01  2015-04-30
.........................................................
10  489997  303307  262281  218513  2015-11-01  2015-11-30
11  479240  297111  256468  213380  2015-12-01  2015-12-31

Я хочу нормализовать цены в ppd_df, чтобы сделать их более сопоставимыми путем деления каждого price_paid по средней стоимости дома для этого определенного типа имущества за месяц, в котором оно было приобретено, и сохраните это новое значение как norm_price.

То есть norm_price для F свойства с deed_date of 2015-02-16 будет: norm_price = price_paid / (205163)

Я думаю, мне нужно создать for l oop, который проходит через каждую строку в ppd_df но я не уверен, как go об этом. Я пытался использовать .itertuples. .merge и np.searchsorted как в Pandas: выберите строки DF на основе другого DF . Ответы здесь также кажутся похожими, но я не могу заставить его работать для моей проблемы.

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Используя решение @ Pri sh, я могу ответить на мой вопрос еще несколькими шагами:

def norm(row):
   t_col = row['property_type'] + '_price'
   date = row['deed_date']
   d_row = ave_df.index.values[(date >= ave_df['price_date']) & (date <= ave_df['month_end'])]                       
   ave_price = ave_df.loc[d_row, t_col].values[0]
   return ave_price

ppd_df['norm_price'] = ppd_df['price_paid'] / ppd_df.apply(lambda row: norm(row), axis=1)
0 голосов
/ 03 марта 2020

для быстрого решения вы можете сделать что-то вроде:

ppd_df.loc[ppd_df['property_type']=='T','norm_price'] = ppd_df['price_paid']/ave_df['T_price'] 

аналогичная вещь для остальной части property_type.

РЕДАКТИРОВАТЬ: вы можете автоматизировать его следующим образом:

property_type = ppd_df['property_type'].unique()

for property in property_type:
    property_col = property + '_price'
    ppd_df.loc[(ppd_df['property_type']==property) & (ppd_df['deed_date'].str[:7]==ave_df['month_end'].str[:7]),'norm_price'] = ppd_df['price_paid']/ave_df[property_col] 

EDIT:
Check the updated answer. Now it also compares Year/month value of deed_date from ppd_df against month_end value of ave_df. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...