比较2个数据框并按顺序添加列(如果不存在)

时间:2018-11-28 13:12:20

标签: python-3.x pandas

我有2个数据框。 df_A-这是一个模板数据框,具有按顺序指定的列数。

例如:[emp_id,名字,姓氏,年龄,性别,部门]

df_B-这是一个数据帧,可能包含也可能不包含df_A的所有列。

例如:[emp_id,first_name,last_name,age,dept] = [001,john,mathew,32,047]

我想比较df_B和df_A以创建一个新的数据框 [001,john,mathew,None,047],列名称与df_A相同。

我正在使用python3。我尝试使用

col_diff = df_A.columns.difference(df_B) 

获取“性别”列。然后将其转换为列表

col_diff.tolist() 

并将其添加到df_B。但是此列被添加到df_B的末尾,我得到

[001,约翰,马修,047,无]

但是我想保留与df_A相同的列顺序。

输出应为: [001,约翰,马修,无,047]

能请你帮忙吗?感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

数据:

c1 = ['emp_id', 'first_name', 'last_name', 'age', 'gender', 'dept']
df_A = pd.DataFrame(columns=c1)
print (df_A)
Empty DataFrame
Columns: [emp_id, first_name, last_name, age, gender, dept]
Index: []

c2 = ['emp_id', 'first_name', 'last_name', 'age', 'dept']
df_B = pd.DataFrame([[ '001', 'john', 'mathew', 32, '047']], columns=c2)
print (df_B)
  emp_id first_name last_name  age dept
0    001       john    mathew   32  047

首先通过difference得到列的差,然后由dict.fromkeys创建assign个新列,最后使用reindex进行相同的排序:

col_diff = df_A.columns.difference(df_B.columns) 
print (col_diff)
Index(['gender'], dtype='object')

df = df_B.assign(**dict.fromkeys(col_diff, None)).reindex(columns=df_A.columns)
print (df)
  emp_id first_name last_name  age gender dept
0    001       john    mathew   32   None  047

另一种解决方案:

df = df_B.reindex(columns=df_A.columns)
print (df)
  emp_id first_name last_name  age  gender dept
0    001       john    mathew   32     NaN  047