簡體   English   中英

基於 Python 中的另一個 dataframe 更新一個 dataframe

[英]Updating a dataframe based on another dataframe in Python

我有一個 DataFrame,比如說 df1,它的所有列都正確,除了“員工”列。 還有另一個 DataFrame,比如說 df2,它有正確的員工姓名,但存儲在“員工”列中。 我正在嘗試根據相應 DataFrame 中的 'key_df1' 和 'key_df2' 更新 df1。 需要一些幫助來解決這個問題。 (請看下圖中預期的output)

data1=[['NYC-URBAN','JON','$5000','yes','BANKING','AC32456'],['WDC-RURAL','XING','$4500','Yes','FINANCE','AD45678'],['LONDON-URBAN','EDWARDS','$3500','No','IT','DE43216'],
     ['SINGAPORE-URBAN','WOLF','$5000','No','SPORTS','RT45327'],['MUMBAI-RURAL','NEMBIAR','$2500','No','IT','Rs454457']]

data2=[['NYC','MIKE','BANKING','BIKING','AH56245'],['WDC','ALPHA','FINANCE','TREKKING','AD45678'],
     ['LONDON-URBAN','BETA','FINANCE','SLEEPING','DE43216'],['SINGAPORE','WOLF','SPORTS','DANCING','RT45307'],
     ['MUMBAI','NEMBIAR','IT','ZUDO','RS454453']]

List1=['City','Employee', 'Income','Travelling','Industry', 'Key_df1']
List2=['City','Staff','Industry','Hobby', 'Key_df1']

df1=pd.DataFrame(data1,columns=List1)
df2=pd.DataFrame(data2,columns=List2)

預期輸出:

在此處輸入圖像描述

編輯(附加查詢):

感謝您的回復。 除了上述問題,我想將 'Employee' 列的值與 df1 中的 'Travelling' 列連接起來,僅用於 Key_df1 和 Key_df2 在兩個 DataFrame 中關聯的行。 請參閱下面的第二個預期 output。

在此處輸入圖像描述

首先將df1中的索引設置為Key_df1 ,並保存為臨時DataFrame:

wrk = df1.set_index('Key_df1')

然后使用df2更新(就地)其Employee列,索引設置為Key_df2 ,僅采用Staff列:

wrk.Employee.update(df2.set_index('Key_df2').Staff)

最后一個操作是將索引更改為“常規”列並將其移動到上一個位置:

result = wrk.reset_index().reindex(columns=List1)

結果是:

              City Employee Income Travelling Industry   Key_df1
0        NYC-URBAN      JON  $5000        yes  BANKING   AC32456
1        WDC-RURAL    ALPHA  $4500        Yes  FINANCE   AD45678
2     LONDON-URBAN     BETA  $3500         No       IT   DE43216
3  SINGAPORE-URBAN     WOLF  $5000         No   SPORTS   RT45327
4     MUMBAI-RURAL  NEMBIAR  $2500         No       IT  Rs454457

按照關於旅行專欄的評論進行編輯

現在僅僅更新是不夠的,任務必須以另一種方式解決。

從加入df1df2.Staff開始(使用set_index正確加入):

result = df1.join(df2.set_index('Key_df2').Staff, on='Key_df1')

第二步(實際更新)是:

result.Employee.where(result.Staff.isna(), result.Staff + '_' + result.Travelling,
    inplace=True)

最后一步是刪除Staff列(不再需要):

result.drop(columns=['Staff'], inplace=True)

最終結果是:

              City   Employee Income Travelling Industry   Key_df1
0        NYC-URBAN        JON  $5000        yes  BANKING   AC32456
1        WDC-RURAL  ALPHA_Yes  $4500        Yes  FINANCE   AD45678
2     LONDON-URBAN    BETA_No  $3500         No       IT   DE43216
3  SINGAPORE-URBAN       WOLF  $5000         No   SPORTS   RT45327
4     MUMBAI-RURAL    NEMBIAR  $2500         No       IT  Rs454457

您可以使用 Boolean 索引,例如:

mask = df1.Key_df1 == df2.Key_df1.reindex(df1.index)
df1.loc[mask, 'Employee'] = df2.Staff

Output:

              City Employee Income Travelling Industry   Key_df1
0        NYC-URBAN      JON  $5000        yes  BANKING   AC32456
1        WDC-RURAL    ALPHA  $4500        Yes  FINANCE   AD45678
2     LONDON-URBAN     BETA  $3500         No       IT   DE43216
3  SINGAPORE-URBAN     WOLF  $5000         No   SPORTS   RT45327
4     MUMBAI-RURAL  NEMBIAR  $2500         No       IT  Rs454457

您還可以使用 numpy 其中:

import numpy as np

df1['Employee'] = np.where(df1['Key_df1'] == df2['Key_df1'], df2['Staff'], df1['Employee'])

暫無
暫無

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

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