簡體   English   中英

使用在單獨的數據幀中使用 python 查找的值計算新數據幀列中的值

[英]Calculate values in a new dataframe column using values looked-up in a seperate dataframe using python

(提前抱歉,我是 Stack 的新手,這是我的第一個問題)

我有兩個數據ppd_df: ,一個包含不同屬性的房價, 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 deed_date為 2015-02-16 的F財產的deed_date將是: norm_price = price_paid / ( 205163)

我想我需要創建一個for循環來遍歷ppd_df每一行,但我不確定如何去做。 我試過使用.itertuples .mergenp.searchsorted就像在Pandas 中一樣:根據另一個 DF 選擇 DF 行 . 這里的答案似乎也相似,但我無法解決我的問題。

謝謝!

使用@Prish 的解決方案,我設法通過幾個步驟來回答我的問題:

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)

要獲得快速解決方案,您可以執行以下操作:

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. 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM