我希望能在思考python问题时获得一些帮助。我有一个数据总帐,并希望删除或转为零,任何应计。所有这些意味着,我想在一列中找到一个数字,并在另一列中搜索它。如果我找到匹配项,我想将两个数字(可迭代数字和找到的数字)都变为零。
我知道我需要使用某种形式的迭代,如下所示:
for x in df[column 1]:
if x is in df[column 2]:
x == 0
df[column 2 [index?]] == 0
else:
continue
有人可以协助我编写正确的代码来完成此任务吗?我的目标是两个基本上遍历两列,找到两个值匹配的位置,并将这些值转换为0.谢谢。
答案 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])