Python:如果列中的值等于另一列中的任何值,则将两个值都转为零

时间:2018-06-05 03:30:10

标签: python arrays pandas

我希望能在思考python问题时获得一些帮助。我有一个数据总帐,并希望删除或转为零,任何应计。所有这些意味着,我想在一列中找到一个数字,并在另一列中搜索它。如果我找到匹配项,我想将两个数字(可迭代数字和找到的数字)都变为零。

我知道我需要使用某种形式的迭代,如下所示:

for x in df[column 1]:
    if x is in df[column 2]:
        x == 0
        df[column 2 [index?]] == 0
    else:
        continue

有人可以协助我编写正确的代码来完成此任务吗?我的目标是两个基本上遍历两列,找到两个值匹配的位置,并将这些值转换为0.谢谢。

4 个答案:

答案 0 :(得分:0)

您需要使用enumerate来获取索引,以便将列表中的值设置为零:

for i, x in enumerate(df[col1]):
    matches = [j for j, y in enumerate(df[col2].isin([x])) if y is True]
    if len(matches) == 0: continue
    df[col1][i] = 0
    k = matches[0]
    df[col2][k] = 0

如果df [col1]中的元素多次出现在df [col2]中,则只会将第一次出现设置为0.

如果要删除所有匹配项,可以使用以下代码:

for i, x in enumerate(df[col1]):
    matches = [j for j, y in enumerate(df[col2].isin([x])) if y is True]
    if len(matches) == 0: continue
    df[col1][i] = 0
    for k in matches:
        df[col2][k] = 0

答案 1 :(得分:0)

您可以使用--one

执行此操作
one

迭代any并在list = ["one", "two", "three"] foo = ["bannana", "apple", "two", "blue"] o = [] for x in foo: if any(n in x for n in list): o.append(0) else: o.append(x) print(o) 中找到匹配项时将0附加到输出列表中如果找不到匹配项则返回值:

foo

更新

实际上,这比我之前更好地回答了你的问题 - 使用列表理解:

list

['bannana', 'apple', 0, 'blue'] 是包含要检查项目的列表,foo = [[1, 2, 3, 5], [9, 7, 2, 4]] for x in foo[1]: if x in foo[0]: foo[0] = [0 if i == x else i for i in foo[0]] foo[1] = [0 if i == x else i for i in foo[1]] print(foo) 是要检查的项目。这会输出foo[0]

答案 2 :(得分:0)

import numpy as np
idx = np.flatnonzero(df['col1'] == df['col2'])
df['col1'][idx] = 0
df['col2'][idx] = 0

您可以使用numpy.allclose()来测试大致相等,而不是完全相等:

idx = np.flatnonzero(np.allclose(df['col1'], df['col2']))

答案 3 :(得分:0)

我认为您可以使用isin

df[column 1] = df[column 1] * (~df[column 1].isin(df[column 2])
df[column 2] = df[column 2] * (~df[column 2].isin(df[column 1])