Python Pandas:如果满足条件,则对 df 进行两项更改

问题描述 投票:0回答:2

我是 python 新手,试图理解为什么我的函数不起作用。任何关于为什么它不起作用以及如何修复的指导将非常感激。

这是我开始的 df:

import pandas as pd

df= pd.DataFrame({'A': [0, 1, 2, 3, 4],
                  'B': [0, 6, 7, 8, 9],
                  'C': [1, 2, 3, 4, 5],
                  'D': ['a', 'b', 'c', 'd', 'e'],
                  'E': ['f', 1, 2, 'd', 'e']})
df 

我只想评估此函数的 A-C 列。如果 A-C 列中的任何行 >3,我想向该列添加 3 并将二进制标志列更改为 1。这是我创建的函数:

def two_chng(self):
cols=['A','B','C']
df['NEW_BINARY']=0
for i in range(len(cols)):
    if (df[cols[i]]>3).any:
        df[cols[i]]=  df[cols[i]]+3
        df['NEW_BINARY']=1
df[cols].apply(two_chng)
df

我希望生成的数据如下所示:我不明白第一行在每列中添加了 9,后续列已将第 1 行的值添加到自身。

res= pd.DataFrame({'A': [0, 1, 2, 6, 7],
                  'B': [0, 9, 10, 11, 12],
                  'C': [1, 2, 3, 7, 8],
                  'D': ['a', 'b', 'c', 'd', 'e'],
                  'E': ['f', 1, 2, 'd', 'e'],
                  'NEW_BINARY': [0, 1, 1, 1, 1]})

res
python pandas function if-statement apply
2个回答
1
投票

我会使用布尔掩码:

# columns of interest
cols = ['A', 'B', 'C']

# identify values > 3
m = df[cols].gt(3)

# increment them
df[cols] = df[cols].mask(m, df[cols]+3)

# set the flag if any value was >3 per row
df['NEW_BINARY'] = m.any(axis=1).astype(int)

输出:

   A   B  C  D  E  NEW_BINARY
0  0   0  1  a  f           0
1  1   9  2  b  1           1
2  2  10  3  c  2           1
3  3  11  7  d  d           1
4  7  12  8  e  e           1

1
投票

非常简单:

cols = ['A','B','C']

# where value > 3
mask = df[cols].gt(3)

# add 3 to where it's > 3
df[cols] += mask * 3

# new binary 
df['NEW_BINARY'] = mask.any(axis=1).astype(int)

输出:

   A   B  C  D  E  NEW_BINARY
0  0   0  1  a  f           0
1  1   9  2  b  1           1
2  2  10  3  c  2           1
3  3  11  7  d  d           1
4  7  12  8  e  e           1
© www.soinside.com 2019 - 2024. All rights reserved.