我是 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
我会使用布尔掩码:
# 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
非常简单:
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