Python Pandas:如果满足某个条件,对df进行两次修改

8zzbczxx  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(90)

我是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,随后的列又把第一行的值加到了自己身上。

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
t98cgbkg

t98cgbkg1#

这很简单:

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
wtlkbnrh

wtlkbnrh2#

我会使用布尔掩码:

# 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

相关问题