Dataframe 检查 2 列是否包含相同的元素

Dataframe check if 2 columns contain same elements

我有一个数据框,有 2 列 X 和 Y。

df = pd.DataFrame({ 
'X': ['a', 'a,b,c', 'a,d', 'e,f', 'a,c,d,f', 'e'], 
'Y': ['a', 'a,c,b', 'd,a', 'e,g', 'a,d,f,g', 'e']
})

我想在数据框中创建一个新列('Match'),如果列 X 和 Y 具有相同的元素,则为 True,否则为 False。

df = pd.DataFrame({ 
'X': ['a', 'a,b,c', 'a,d', 'e,f', 'a,c,d,f', 'e'], 
'Y': ['a', 'a,c,b', 'd,a', 'e,g', 'a,d,f,g', 'e'],
'Match':['True','True','True','False','False','True']
})

请帮我解决这个问题

这个有效:

df['Match']=df['X'].apply(set)==df['Y'].apply(set)

基本上,我在这里做的是将每一列的每个数据点转换成一个集合,然后比较它们。

它应该独立于 thata 的种类(例如数字或字符串)。

但是请注意,如果有重复,它不会区分。例如,如果您有 'a,c,c,b' 与 'a,c,b',那将产生 True。

您可以尝试拆分列以列出然后排序和比较。

df['Match2'] = df['X'].str.split(',').apply(sorted) == df['Y'].str.split(',').apply(sorted)

或者您可以将列表转换为设置和比较,具体取决于您是否想要复制

df['Match2'] = df['X'].str.split(',').apply(set) == df['Y'].str.split(',').apply(set)
print(df)

         X        Y  Match  Match2
0        a        a   True    True
1    a,b,c    a,c,b   True    True
2      a,d      d,a   True    True
3      e,f      e,g  False   False
4  a,c,d,f  a,d,f,g  False   False
5        e        e   True    True

为了避免重复,你可以这样做

df['Match'] = df[['X', 'Y']].apply(lambda col: col.str.split(',').apply(sorted)).eval('X == Y')

有很多方法可以做到这一点,一种方法是分解数组,对它们进行排序并匹配相等性。

import numpy as np

df1 = df.stack()\
        .str.split(',')\
            .explode()\
            .sort_values()\
            .groupby(level=[0,1])\
            .agg(list).unstack(1)


df['match'] = np.where(df1['X'].eq(df1['Y']),True,False)

         X        Y  match
0        a        a   True
1    a,b,c    a,c,b   True
2      a,d      d,a   True
3      e,f      e,g  False
4  a,c,d,f  a,d,f,g  False
5        e        e   True