更新/合并2个具有不同列名的数据表

时间:2019-07-16 11:52:12

标签: python pandas

我正在使用来自熊猫的数据框,我有2个表: 第一个:

+----------------------------+
|  ID   | Code | Name | Desc |
------------------------------
| 00002 | AAAA | Aaaa | A111 |
------------------------------
| 12345 | BBBB | Bbbb | B222 |
------------------------------
| 01024 | EEEE | Eeee | E333 |
------------------------------
| 00010 | CCCC | Cccc | C444 |
------------------------------
| 00123 | ZZZZ | Zzzz | Z555 |
------------------------------
| ..... | .... | .... | .... |
+----------------------------+

第二张表:

+--------------------------------+
|  EID  | Cat | emaN | No | cseD |
----------------------------------
| 00010 |  1  |      |    |      |
----------------------------------
| 12345 |  1  |      |    |      |      
----------------------------------
|       |  1  |      |    |      |
+--------------------------------+

我想用第一个表中的值更新第二个表,以便得出结果:

+--------------------------------+
|  EID  | Cat | emaN | No | cseD |
----------------------------------
| 00010 |  1  | Сссс |    | С444 |
----------------------------------
| 12345 |  1  | Bbbb |    | B222 |      
----------------------------------
|       |  1  |      |    |      |
+--------------------------------+

但是困难在于列名不同,键ID-> EID和值Name-> emaN,Desc-> cseD,以及Cat列(这些值最初是填充的)和No (空值)必须在输出表中保持不变。同样在第二张表中可以有空的EID,因此该条目应保持原样。

如何进行这样的更新或合并?

谢谢。

2 个答案:

答案 0 :(得分:1)

使用r ight_on left_on 参数尝试pd.merge,以防列名不同而必须合并。

我正在检查final_df ['emaN']是否为null,然后从Code复制值。

然后删除不需要的df1列

如果您希望将数据保存在'df2'中,则将结果保存到新的df final_df

import numpy as np
import pandas as pd

final_df = pd.merge(df2,df1,left_on='EID' ,right_on='ID',how='left')
final_df['emaN'] = np.where(final_df['emaN'].isnull(),final_df['Code'],final_df['emaN'])
final_df['cseD'] = np.where(final_df['cseD'].isnull(),final_df['Desc'],final_df['cseD'])

final_df.drop(['ID','Code','Name','Desc'],axis=1,inplace=True)

答案 1 :(得分:1)

据我了解的问题...

pd.merge(FirstDataFrame, SecondDataFrame, left_on='ID', right_on='EID', how='left')['EID','Cat','emaN','No','cseD']

或者如果您想加入多个领域

pd.merge(FirstDataFrame, SecondDataFrame, left_on=['ID', 'Name', 'Desc'], 
         right_on=['EID', 'emaN','cseD'], how='left') 
['EID','Cat','emaN','No','cseD']

编辑:(见注释,过滤所需的列)