pandas返回数据帧中不在其他数据帧中的列

时间:2017-03-26 12:54:05

标签: python pandas

我有两个看起来像这样的数据框:

df_1 = pd.DataFrame({
'A' : [1.0, 2.0, 3.0, 4.0],
'B' : [100, 200, 300, 400],
'C' : [2, 3, 4, 5] 
                   })

df_2 = pd.DataFrame({
'B' : [1.0, 2.0, 3.0, 4.0],
'C' : [100, 200, 300, 400],
'D' : [2, 3, 4, 5] 
                  })

现在,如果我使用pandas .isin函数,我可以像这样做一些漂亮的东西

>>> print df_2.columns.isin(df_1.columns)
array([ True,  True, False], dtype=bool)

B中的Cdf_2df_1,而D不存在

我的问题是:是否有人知道如何为df_2中存在但不存在于df_1

中的列返回列的标签

类似这样的事情

array([u'D'], dtype=string)

提前谢谢!

4 个答案:

答案 0 :(得分:6)

Pandas index object具有类似于set的属性,因此您可以直接执行:

df_2.columns.difference(df_1.columns)
Index([u'D'], dtype='object')

您还可以使用&|^之类的运算符来计算交集,并集和对称差异:

df_1.columns & df_2.columns
Index([u'B', u'C'], dtype='object')

df_1.columns | df_2.columns
Index([u'A', u'B', u'C', u'D'], dtype='object')

df_1.columns ^ df_2.columns
Index([u'A', u'D'], dtype='object')

使用-运算符作为差异,现已弃用:

df_2.columns - df_1.columns
FutureWarning: using '-' to provide set differences with Indexes is deprecated, use .difference()
Index([u'D'], dtype='object')

答案 1 :(得分:2)

使用numpy.setdiff1d的Numpy解决方案:

a = np.setdiff1d(df_2.columns, df_1.columns)
print (a)
['D']

使用Index.difference的Pandas解决方案:

a = df_2.columns.difference(df_1.columns)
print (a)
Index(['D'], dtype='object')

另一个熊猫方法是intersectionunionsymmetric_difference

print (df_2.columns.intersection(df_1.columns))
Index(['B', 'C'], dtype='object')

print (df_2.columns.union(df_1.columns))
Index(['A', 'B', 'C', 'D'], dtype='object')

print (df_2.columns.symmetric_difference(df_1.columns))
Index(['A', 'D'], dtype='object')

numpy函数是intersect1dunion1dsetxor1d

print (np.intersect1d(df_2.columns, df_1.columns))
['B' 'C']

print (np.union1d(df_2.columns, df_1.columns))
['A' 'B' 'C' 'D']

print (np.setxor1d(df_2.columns, df_1.columns))
['A' 'D']

答案 2 :(得分:0)

这里是好友

set(df_2.columns).difference(df_1.columns)
Out[76]: {'D'}

答案 3 :(得分:0)

您可以使用:

set(df_2.columns.values) - set(df_1.columns.values)

返回一个包含df_2中但不包含df_1中列的列标签的集合。