基于 Python 中的另一个数据帧更新数据帧
Updating a dataframe based on another dataframe in Python
我有一个 DataFrame ,比如说 df1,它的所有列都是正确的,除了 'Employee' 列。还有另一个 DataFrame ,比如 df2,它有正确的员工姓名,但存储在 'Staff' 列中。我正在尝试根据来自各自数据帧的 'key_df1' 和 'key_df2' 更新 df1。需要一些关于如何解决这个问题的帮助。 (请参阅下面图像中的预期输出)
data1=[['NYC-URBAN','JON','00','yes','BANKING','AC32456'],['WDC-RURAL','XING','00','Yes','FINANCE','AD45678'],['LONDON-URBAN','EDWARDS','00','No','IT','DE43216'],
['SINGAPORE-URBAN','WOLF','00','No','SPORTS','RT45327'],['MUMBAI-RURAL','NEMBIAR','00','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 两者中的关系的行数据框。请参阅下面的第二个预期输出。
您可以使用布尔索引,例如:
mask = df1.Key_df1 == df2.Key_df1.reindex(df1.index)
df1.loc[mask, 'Employee'] = df2.Staff
输出:
City Employee Income Travelling Industry Key_df1
0 NYC-URBAN JON 00 yes BANKING AC32456
1 WDC-RURAL ALPHA 00 Yes FINANCE AD45678
2 LONDON-URBAN BETA 00 No IT DE43216
3 SINGAPORE-URBAN WOLF 00 No SPORTS RT45327
4 MUMBAI-RURAL NEMBIAR 00 No IT Rs454457
您还可以在以下位置使用 numpy:
import numpy as np
df1['Employee'] = np.where(df1['Key_df1'] == df2['Key_df1'], df2['Staff'], df1['Employee'])
首先将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 00 yes BANKING AC32456
1 WDC-RURAL ALPHA 00 Yes FINANCE AD45678
2 LONDON-URBAN BETA 00 No IT DE43216
3 SINGAPORE-URBAN WOLF 00 No SPORTS RT45327
4 MUMBAI-RURAL NEMBIAR 00 No IT Rs454457
根据有关 旅行 专栏
的评论进行编辑
现在只是 更新 是不够的,必须以其他方式解决任务。
从加入 df1 和 df2.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 00 yes BANKING AC32456
1 WDC-RURAL ALPHA_Yes 00 Yes FINANCE AD45678
2 LONDON-URBAN BETA_No 00 No IT DE43216
3 SINGAPORE-URBAN WOLF 00 No SPORTS RT45327
4 MUMBAI-RURAL NEMBIAR 00 No IT Rs454457
我有一个 DataFrame ,比如说 df1,它的所有列都是正确的,除了 'Employee' 列。还有另一个 DataFrame ,比如 df2,它有正确的员工姓名,但存储在 'Staff' 列中。我正在尝试根据来自各自数据帧的 'key_df1' 和 'key_df2' 更新 df1。需要一些关于如何解决这个问题的帮助。 (请参阅下面图像中的预期输出)
data1=[['NYC-URBAN','JON','00','yes','BANKING','AC32456'],['WDC-RURAL','XING','00','Yes','FINANCE','AD45678'],['LONDON-URBAN','EDWARDS','00','No','IT','DE43216'],
['SINGAPORE-URBAN','WOLF','00','No','SPORTS','RT45327'],['MUMBAI-RURAL','NEMBIAR','00','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 两者中的关系的行数据框。请参阅下面的第二个预期输出。
您可以使用布尔索引,例如:
mask = df1.Key_df1 == df2.Key_df1.reindex(df1.index)
df1.loc[mask, 'Employee'] = df2.Staff
输出:
City Employee Income Travelling Industry Key_df1
0 NYC-URBAN JON 00 yes BANKING AC32456
1 WDC-RURAL ALPHA 00 Yes FINANCE AD45678
2 LONDON-URBAN BETA 00 No IT DE43216
3 SINGAPORE-URBAN WOLF 00 No SPORTS RT45327
4 MUMBAI-RURAL NEMBIAR 00 No IT Rs454457
您还可以在以下位置使用 numpy:
import numpy as np
df1['Employee'] = np.where(df1['Key_df1'] == df2['Key_df1'], df2['Staff'], df1['Employee'])
首先将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 00 yes BANKING AC32456
1 WDC-RURAL ALPHA 00 Yes FINANCE AD45678
2 LONDON-URBAN BETA 00 No IT DE43216
3 SINGAPORE-URBAN WOLF 00 No SPORTS RT45327
4 MUMBAI-RURAL NEMBIAR 00 No IT Rs454457
根据有关 旅行 专栏
的评论进行编辑现在只是 更新 是不够的,必须以其他方式解决任务。
从加入 df1 和 df2.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 00 yes BANKING AC32456
1 WDC-RURAL ALPHA_Yes 00 Yes FINANCE AD45678
2 LONDON-URBAN BETA_No 00 No IT DE43216
3 SINGAPORE-URBAN WOLF 00 No SPORTS RT45327
4 MUMBAI-RURAL NEMBIAR 00 No IT Rs454457