如何在多列中使用pandas isin

时间:2017-07-19 18:50:55

标签: python pandas

enter image description here

enter image description here

enter image description here

我想找到col1col2的值,其中第一个数据帧的col1col2都在第二个数据帧中。

这些行应位于结果数据框中:

  1. 披萨,男孩

  2. 披萨,女孩

  3. 冰淇淋,男孩

  4. 因为所有三行都在第一个和第二个数据帧中。

    我怎么可能做到这一点?我在考虑使用isin,但是当我不得不考虑多个列时,我不确定如何使用它。

4 个答案:

答案 0 :(得分:8)

col1col2上执行inner merge

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

reset_indexset_index调用的目的是保留df2的索引,就像您发布的所需结果一样。如果索引不重要,那么

pd.merge(df2, df1, how='inner')
#         col1  col2
# 0      pizza   boy
# 1      pizza  girl
# 2  ice cream   boy

就足够了。

或者,您可以在col1col2列中构建MultiIndexs,然后调用MultiIndex.isin method

index1 = pd.MultiIndex.from_arrays([df1[col] for col in ['col1', 'col2']])
index2 = pd.MultiIndex.from_arrays([df2[col] for col in ['col1', 'col2']])
print(df2.loc[index2.isin(index1)])

产量

         col1  col2
10      pizza   boy
11      pizza  girl
16  ice cream   boy

答案 1 :(得分:0)

谢谢你unutbu! 这是一个小更新。

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

答案 2 :(得分:0)

如果必须以某种方式坚持使用isin或否定版本~isin。 您可以首先使用col1col2串联创建一个新列。然后使用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

答案 3 :(得分:0)

最好的方法是将 dict 传递给 isin()

正如 https://www.oreilly.com/library/view/mastering-exploratory-analysis/9781789619638/eb563c9a-83e1-4e0c-82d7-6f83addc3340.xhtml 建议的那样。

文档 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.isin.html 还展示了如何传递字典的另一个示例。