pandas isin()函数与列表

2024-04-25 07:40:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有2个数据帧,我想用

isin() method

检查df1和df2中存在的内容。在

当我只比较一列(index1)时-结果正常-df2.index1中存在df1.index1的2个值。在

但是,当我比较df1和df2的2列(index1,index2)时,所有3行的结果都是错误的,即使只有一个公共行(index1=3,index2=6)。在

为什么?在

谢谢。在

In [2]: import pandas as pd
In [3]: df1 = pd.DataFrame({'A': [1,2,3], 'index1':[1,2,3], 'index2':[4,5,6]})
In [4]: df2 = pd.DataFrame({'A': [4,5,6], 'index1':[2,3,4], 'index2':[7,6,5]})


In [5]: df1
Out[5]:    
   A  index1  index2
0  1       1       4
1  2       2       5
2  3       3       6

In [6]: df2
Out[6]:    
   A  index1  index2
0  4       2       7
1  5       3       6
2  6       4       5

In [7]: df1['index1'].isin(df2['index1'])
Out[7]: 
0     False
1     True
2     True
Name: index1, dtype: bool

In [8]: df1['index2'].isin(df2['index2'])
Out[8]: 
0     False
1     True
2     True
Name: index2, dtype: bool

In [9]: df1[['index1','index2']].isin(df2[['index1', 'index2']])
Out[9]:   
   index1 index2
0  False  False
1  False  False
2  False  False

Tags: 数据nameinfalsetruedataframeoutpd
1条回答
网友
1楼 · 发布于 2024-04-25 07:40:38

这是因为“只有在所有标签都匹配的情况下,结果才会在某个位置为真。”(docs)。如果要忽略标签,则需要使用底层numpy数组:

df1[['index1','index2']].isin(df2[['index1', 'index2']].values.ravel())
Out: 
   index1  index2
0   False    True
1    True    True
2    True    True

如果希望标签与列匹配,可以使用字典:

^{pr2}$

如果要检查行是否完全匹配,则需要使用merge:

df1.merge(df2, how='left', on=['index1', 'index2'], indicator=True)
Out: 
   A_x  index1  index2  A_y     _merge
0    1       1       4  NaN  left_only
1    2       2       5  NaN  left_only
2    3       3       6  5.0       both

当index1和index2都匹配时,_merge列返回{}。在

相关问题 更多 >