Python 跨多个列使用isin

Python 跨多个列使用isin,python,isinstance,Python,Isinstance,我正在尝试将.isin与~一起使用,以便根据2个数据集中的多个列返回唯一行的列表 因此,我有两个数据集,共9行: df1是底部,df2是顶部(很抱歉,我不能让它同时显示下面的两个,它显示了1,然后是一行数字) 我想从df1中获得一个列表,其中不在df2中的行基于多个列 例如,如果我基于列Serial和Count进行搜索,我将无法从df1中获取索引1和2,因为它在df2中的索引位置6处出现,与df1中的索引位置4在df2中的索引位置2处出现的情况相同。这同样适用于df1中的索引位置5,因为它位于d

我正在尝试将.isin与~一起使用,以便根据2个数据集中的多个列返回唯一行的列表

因此,我有两个数据集,共9行: df1是底部,df2是顶部(很抱歉,我不能让它同时显示下面的两个,它显示了1,然后是一行数字)

我想从df1中获得一个列表,其中不在df2中的行基于多个列

例如,如果我基于列Serial和Count进行搜索,我将无法从df1中获取索引1和2,因为它在df2中的索引位置6处出现,与df1中的索引位置4在df2中的索引位置2处出现的情况相同。这同样适用于df1中的索引位置5,因为它位于df2中的索引位置8

搅动栏其实并不重要

我可以让它工作,但只基于一列,但不超过一列

df2[~df2.Serial.isin(df1.Serial.values)]有点像我想要的,但只在1列上。我希望它是基于2或更多

  Index Serial  Count   Churn
   3    9          3    0
   6    1          9    1
   7    10         3    1
   8    6          7    1
   9    4          8    0

一种解决方案是与指标合并:

df1 = pd.DataFrame([[10, 2, 0], [9, 4, 1], [9, 8, 1], [8, 6, 1], [9, 8, 1], [1, 9, 1], [10, 3, 1], [6, 7, 1], [4, 8, 1]], columns=['Serial', 'Count', 'Churn'])
df2 = pd.DataFrame([[9, 5, 1], [8, 6, 1], [10, 2, 1], [7, 4, 1], [7, 9, 1], [10, 2, 1], [2, 9, 1], [9, 8, 1], [4, 3, 1]], columns=['Serial', 'Count', 'Churn'])
# merge with indicator on
df_temp = df1.merge(df2[['Serial', 'Count']].drop_duplicates(), on=['Serial', 'Count'], how='left', indicator=True)
res = df_temp.loc[df_temp['_merge'] == 'left_only'].drop('_merge', axis=1)

Output        
   Serial  Count  Churn
1       9      4      1
5       1      9      1
6      10      3      1
7       6      7      1
8       4      8      1

我也有类似的问题要解决,我找到了最简单的方法来解决它,创建一个临时列,它由合并的标识符列组成,并在这个新创建的临时列值上使用
isin

实现这一点的简单功能如下

from functools import reduce

get_temp_col = lambda df, cols: reduce(lambda x, y: x + df[y].astype('str'), cols, "")

def subset_on_x_columns(df1, df2, cols):
    """
    Subsets the input dataframe `df1` based on the missing unique values of input columns
    `cols` of dataframe `df2`.

    :param df1: Pandas dataframe to be subsetted
    :param df2: Pandas dataframe which missing values are going to be 
                used to subset `df1` by
    :param cols: List of column names
    """
    df1_temp_col = get_temp_col(df1, cols)
    df2_temp_col = get_temp_col(df2, cols)

    return df1[~df1_temp_col.isin(df2_temp_col.unique())]
因此,对于您的案例,所需的只是执行:

result_df = subset_on_x_columns(df1, df2, ['Serial', 'Count'])
其中包含所需的行:

   Index  Serial  Count  Churn
      3       9      3      0
      6       1      9      1
      7      10      3      1
      8       6      7      1
      9       4      8      0

这个解决方案的好处是,它在使用的列数上自然是可伸缩的,也就是说,只需在输入参数列表
cols
中指定要用作标识符的列。

,df2中的行在df1中不存在。抱歉,我从未注意到。TBH它可以是任意的,因为它只是意味着切换df1和df2。我要找的更多的是如何让查询工作。这是真的,我相信你的编辑破坏了你的一个数据帧,因为它们现在包含相同的值。是的,很抱歉,我没有注意到。我现在已经修好了。谢谢,行了。我不能给你“有用的答案”,因为我没有足够的代表做,谢谢。第一篇文章在这里,所以我甚至不知道这是一个选择。再次谢谢。没问题,很高兴我能帮上忙!
   Index  Serial  Count  Churn
      3       9      3      0
      6       1      9      1
      7      10      3      1
      8       6      7      1
      9       4      8      0