簡體   English   中英

Python:如果一列中的值等於另一列中的任何值,請將兩個值都設為零

[英]Python: if a value in a column equals any value in another column, turn both values to zero

我希望我在思考python問題時能得到一些幫助。 我有一個總帳數據,想刪除任何應計項目或將其歸零。 所有這些意味着,我想在一列中找到一個數字,然后在另一列中進行搜索。 如果找到匹配項,我想將兩個數字(可迭代數字和找到的數字)都設為零。

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

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

有人可以協助我編寫正確的代碼來實現這一目標嗎? 我的目標是從本質上講兩個對象遍歷兩列,找到兩個值匹配的地方,然后將這些值設為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
    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

您可以使用以下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)

如果在list找到匹配項,則它循環遍歷foo並將零添加到輸出列表;否則,如果找不到匹配項,則返回值:

['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]是要檢查的項目的列表,而foo[1]是要檢查的項目的列表。 輸出[[1, 0, 3, 5], [9, 7, 0, 4]]

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

我認為您可以使用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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM