检查列中的值是不是存在于数据框行中的其他位置
Posted
技术标签:
【中文标题】检查列中的值是不是存在于数据框行中的其他位置【英文标题】:Check if values in a column exist elsewhere in a dataframe row检查列中的值是否存在于数据框行中的其他位置 【发布时间】:2022-01-21 17:42:42 【问题描述】:假设我有一个如下的数据框:
df = pd.DataFrame('a':[1,2,3,4],'b':[2,3,4,5],'c':[3,4,5,6],'d':[5,3,2,4])
我想检查d
列中的元素是否存在于其对应行的其他位置。所以我想要的结果是
[False, True, False, True]
为此,我使用了
df.apply(lambda x: x['d'] in x[['a','b','c']], axis=1)
但这以某种方式给了我[False, False, False, False]
。
【问题讨论】:
【参考方案1】:试试:
out = (df[['a','b','c']].T==df['d']).any()
输出:
0 False
1 True
2 False
3 True
dtype: bool
【讨论】:
【参考方案2】:需要添加“值”:
df.apply(lambda x: x['d'] in x[['a','b','c']].values, axis=1)
Out[11]:
0 False
1 True
2 False
3 True
dtype: bool
您输入的是检查 x['d'] 是否在 x[['a','b','c']] 的 keys 集合中,而不是值。字典的工作方式类似:
1 in 'a': 1, 'b': 2
Out[30]: False
1 in 'a': 1, 'b': 2.values()
Out[31]: True
【讨论】:
【参考方案3】:试试
df.eq(df.pop('d'),axis=0).any(1)#.values
0 False
1 True
2 False
3 True
dtype: bool
【讨论】:
【参考方案4】:使用eq 跨列广播相等比较。然后检查该行是否有any匹配:
df.drop(columns='d').eq(df['d'], axis=0).any(axis=1).array
<PandasArray>
[False, True, False, True]
Length: 4, dtype: bool
Speedwise,一个 numpy 选项是最好的。
【讨论】:
【参考方案5】:利用 numpy 广播,你可以轻松做到:
(df[['d']].to_numpy() == df.to_numpy())[:, :-1].any(axis=1)
输出:
array([False, True, False, True])
使用 numpy 的速度差不多。
【讨论】:
以上是关于检查列中的值是不是存在于数据框行中的其他位置的主要内容,如果未能解决你的问题,请参考以下文章
检查一列中的值是不是存在于另一列中,如果存在,则将另一列中的值复制到新列中