Python 如何对多个列使用isin
我想找到Python 如何对多个列使用isin,python,pandas,Python,Pandas,我想找到col1和col2的值,其中第一个数据帧的col1和col2都在第二个数据帧中 这些行应位于结果数据框中: 比萨饼,小子 披萨,女孩 冰淇淋,孩子 因为所有三行都在第一个和第二个数据帧中 我怎么可能做到这一点?我在考虑使用 ISIN ,但是当我必须考虑一个以上的列时,我不知道如何使用它。 < P>执行一个ON代码> COL1和 COL2< /代码>: import pandas as pd df1 = pd.DataFrame({'col1': ['pizza', 'hamburger'
col1
和col2
的值,其中第一个数据帧的col1
和col2
都在第二个数据帧中
这些行应位于结果数据框中:
import pandas as pd
df1 = pd.DataFrame({'col1': ['pizza', 'hamburger', 'hamburger', 'pizza', 'ice cream'], 'col2': ['boy', 'boy', 'girl', 'girl', 'boy']}, index=range(1,6))
df2 = pd.DataFrame({'col1': ['pizza', 'pizza', 'chicken', 'cake', 'cake', 'chicken', 'ice cream'], 'col2': ['boy', 'girl', 'girl', 'boy', 'girl', 'boy', 'boy']}, index=range(10,17))
print(pd.merge(df2.reset_index(), df1, how='inner').set_index('index'))
屈服
col1 col2
index
10 pizza boy
11 pizza girl
16 ice cream boy
col1 col2
10 pizza boy
11 pizza girl
16 ice cream boy
reset\u index
和set\u index
调用的目的是将df2
的索引保留为您发布的所需结果。如果索引不重要,则
pd.merge(df2, df1, how='inner')
# col1 col2
# 0 pizza boy
# 1 pizza girl
# 2 ice cream boy
就够了
或者,您可以从
col1
和col2
列中构造,然后调用:
屈服
col1 col2
index
10 pizza boy
11 pizza girl
16 ice cream boy
col1 col2
10 pizza boy
11 pizza girl
16 ice cream boy
谢谢你!
这里有一点更新
import pandas as pd
df1 = pd.DataFrame({'col1': ['pizza', 'hamburger', 'hamburger', 'pizza', 'ice cream'], 'col2': ['boy', 'boy', 'girl', 'girl', 'boy']}, index=range(1,6))
df2 = pd.DataFrame({'col1': ['pizza', 'pizza', 'chicken', 'cake', 'cake', 'chicken', 'ice cream'], 'col2': ['boy', 'girl', 'girl', 'boy', 'girl', 'boy', 'boy']}, index=range(10,17))
df1[df1.set_index(['col1','col2']).index.isin(df2.set_index(['col1','col2']).index)]
返回:
col1 col2
1 pizza boy
4 pizza girl
5 ice cream boy
如果您必须坚持使用
isin
或否定版本~isin
。
您可以首先创建一个新列,将col1
,col2
串联在一起。然后使用isin
过滤数据。代码如下:
import pandas as pd
df1 = pd.DataFrame({'col1': ['pizza', 'hamburger', 'hamburger', 'pizza', 'ice cream'], 'col2': ['boy', 'boy', 'girl', 'girl', 'boy']}, index=range(1,6))
df2 = pd.DataFrame({'col1': ['pizza', 'pizza', 'chicken', 'cake', 'cake', 'chicken', 'ice cream'], 'col2': ['boy', 'girl', 'girl', 'boy', 'girl', 'boy', 'boy']}, index=range(10,17))
df1['indicator'] = df1['col1'].str.cat(df1['col2'])
df2['indicator'] = df2['col1'].str.cat(df2['col2'])
df2.loc[df2['indicator'].isin(df1['indicator'])].drop(columns=['indicator'])
给
col1 col2
10 pizza boy
11 pizza girl
16 ice cream boy
如果这样做,请记住确保连接两列不会产生误报,例如df1
中的123
和456
的连接以及df2
中的12
和3456
的连接将匹配,即使它们各自的列不匹配。您可以通过附加sep
参数来解决此问题
df1['indicator'] = df1['col1'].str.cat(df1['col2'], sep='$$$')
df2['indicator'] = df2['col1'].str.cat(df2['col2'], sep='$$$')
最好的方法是将dict传递给isin() 正如建议的那样 文档还显示了如何传递字典的另一个示例