如果熊猫满足条件,则更新列

时间:2021-04-29 16:37:26

标签: python pandas dataframe

我有一个数据框要处理,我正在执行多项检查。

我正在检查“A”、“B”和“C”列下的重复值是否显示相同的数字,但 D 列下的符号是否相反。

<头>
A B C D E
1111 AAA 123 0.01 评论被替换
2222 BBB 456 5 评论被替换
3333 CCC 789 10 什么都不做
1111 AAA 123 -0.01 评论被替换
2222 BBB 456 -5 评论被替换
3333 CCC 789 -9 什么都不做

请看下面我的代码。当我尝试替换“E”列下的注释时,它不起作用。我确定我做错了什么。 我完全意识到我没有以最有效的方式编写代码,我仍然是一个新手。您能否以更有效的方式帮助我实现这一目标,并且出于好奇,如果我决定继续使用这种“非高效”的方式,如何实现这一目标?

谢谢。

for i in range(0, len(df)-1):
    for j in range(i+1, len(df)):
        if (df['A'][i] == df['A'][j]) & (df['B'][i] == df['B'][j]) & (df['C'][i] == df['C'][j]) & (df['D'][i] + df['D'][j] = 0) :
            df['E'][i] = 'it works!'

2 个答案:

答案 0 :(得分:6)

我们可以groupABC上的数据框以及D列中的一系列绝对值,然后transformD 使用 sum因为如果对具有相反的符号,那么总和必须为零)来检查是否存在具有相同幅度但符号相反的对 >

df['E'] = df.groupby(['A', 'B', 'C', df['D'].abs()])['D'].transform('sum').eq(0) 

      A    B    C      D      E
0  1111  AAA  123   0.01   True
1  2222  BBB  456   5.00   True
2  3333  CCC  789  10.00  False
3  1111  AAA  123  -0.01   True
4  2222  BBB  456  -5.00   True
5  3333  CCC  789  -9.00  False

答案 1 :(得分:0)

如果您在 E 中有超过一对,或者有 1 个正数和多个负数,反之亦然,则此方法有效。

import pandas as pd
import numpy as np

df_1 = df[df['D'] >= 0].copy().reset_index()
df_2 = df[df['D'] < 0].copy().reset_index()
df_2['D'] = -df_2['D']

indexes = df_1.merge(df_2, on=['A', 'B', 'C', 'D'], how='inner')[['index_x', 'index_y']].values.tolist()
indexes = [item for sublist in indexes for item in sublist]

df['E_new'] = np.where(df.index.isin(indexes), 'new comment', df['E'])

print(df)

#       A    B    C      D                       E              E_new
# 0  1111  AAA  123   0.01  comment to be replaced        new comment
# 1  2222  BBB  456   5.00  comment to be replaced        new comment
# 2  3333  CCC  789  10.00       don't do anything  don't do anything
# 3  1111  AAA  123  -0.01  comment to be replaced        new comment
# 4  2222  BBB  456  -5.00  comment to be replaced        new comment
# 5  3333  CCC  789  -9.00       don't do anything  don't do anything