我有两个看起来像这样的数据框:
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
中的C
和df_2
列df_1
,而D
不存在
我的问题是:是否有人知道如何为df_2中存在但不存在于df_1
中的列返回列的标签类似这样的事情
array([u'D'], dtype=string)
提前谢谢!
答案 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')
另一个熊猫方法是intersection
,
union
和symmetric_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函数是intersect1d
,union1d
和setxor1d
:
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
中列的列标签的集合。