首页 > 解决方案 > 比较 2 个数据框并按顺序添加列(如果不存在)

问题描述

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

例如:[emp_id、first_name、last_name、年龄、性别、部门]

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 的列名相同。

我正在使用 python 3。我尝试使用

col_diff = df_A.columns.difference(df_B) 

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

col_diff.tolist() 

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

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

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

输出应该是:[001, john, mathew, None, 047]

能否请你帮忙?谢谢你的时间。

标签: python-3.xpandas

解决方案


数据:

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,然后assign创建新列dict.fromkeys并用于相同的排序使用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

推荐阅读