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

发布于 2025-01-30 19:27:22 字数 460 浏览 2 评论 0原文

我有一个数据框,并有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否则错误。

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']
})

请帮助我

I have a data frame and with 2 columns 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']
})

I want to create a new column('Match') in the dataframe such if the columns X & Y have the same elements, then True else 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']
})

Kindly help me with this

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

白芷 2025-02-06 19:27:22

这起作用:

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

基本上,我在这里做的是将每个数据点从每列转换为一组,然后将它们进行比较。

它应该独立于那种(例如数字或字符串)独立起作用。

但是,请注意,如果有复制,则不会有所不同。例如,如果您具有'a,c,c,b'vs'a,c,b',那将产生真实。

This works:

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

Basically, what I'm doing here is to convert each data point from each column into a set, and then comparing them.

It should work independently of the kind of thata (numbers or strings for example).

Notice, however, it wont differenciate if there're replicates. For example, if you have 'a,c,c,b' vs 'a,c,b', that would yield True.

So要识趣 2025-02-06 19:27:22

您可以尝试将列拆分以列出,然后进行排序并进行比较。

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')

You can try split the column to list then sort and compare.

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

Or you can convert list to set and compare depending on if you want duplicated

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

To avoid repeating, you can do

df['Match'] = df[['X', 'Y']].apply(lambda col: col.str.split(',').apply(sorted)).eval('X == Y')
断桥再见 2025-02-06 19:27:22

许多方法可以做到这一点,一种方法是爆炸您的数组,对它们进行排序并匹配以保持平等。

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

Lots of ways to do this, one way would be to explode your arrays, sort them and match for equality.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文