Pandas将许多列相互比较,如果其中任何两列相同,则为真

2024-09-28 01:22:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

^{tb1}$

我需要得到一个新的列“Result”,在这里我比较第1部分到第6部分列中的所有值,如果任意两列中的文本相同,则结果为真,反之亦然。 它必须是这样的:

^{tb2}$

有什么简单的方法吗? 我试过这样的方法:

df['Result'] = (df['part1']==df['part2']) | (df['part1']==df['part3']) | (df['part1']==df['part4']) | (df['part1']==df['part5']) | (df['part2']==df['part3']) | (df['part2']==df['part4']) | (df['part2']==df['part5']) |(df['part3']==df['part4']) | (df['part3']==df['part5']) | (df['part4']==df['part5'])

但这种方式太奇怪和不舒服了,我相信它有更好的解决办法。(在我的任务中,我必须比较21列)


Tags: 数据方法文本df方式resultpart2part1
2条回答

在你的情况下,试试看

df['out'] = df.filter(like='part').apply(lambda x : x[x!='None'].duplicated().any(),1)
Out[24]: 
0     True
1    False
2     True
3     True
4    False
5     True
dtype: bool

这个答案是针对问题的前一个版本编写的,其中part1与所有其他列进行比较,而不是搜索任何重复的part#

执行基于索引的相等性比较,然后跨行使用any进行缩减(通过指定columns,这是有意义的,但不太直观)

>>> df.filter(regex=r'part[2-9]').eq(df['part1'], axis='index').any(axis='columns')
0     True
1    False
2     True
3     True
4    False
5     True
dtype: bool

请注意,我使用filter快速选择part2part6列,也可以手动指定。必须将axis='index'axis='columns'(或相应的int)分别传递给df.eqdf.any,才能正确地进行比较和缩减

相关问题 更多 >

    热门问题