假设我有一个像这样的DataFrame对象:
age_diff result
1 0
-1 1
0 1
我希望通过应用age_diff
函数替换列abs
中的负值。此外,如果age_diff
中的值发生更改,则应切换列result
中的值(如果为0则为1,否则为0)。
在此转换之后,如上所示,DataFrame应如下所示:
age_diff result
1 0
1 0
0 1
任何人都可以指出我如何实现这一目标?
答案 0 :(得分:5)
print (df)
age_diff result
0 1 0
1 -1 0
2 -1 1
3 0 1
mask = df['age_diff'] < 0
df['age_diff'] = df['age_diff'].abs()
df['result'] = df['result'].mask(mask, df['result'].map({0:1, 1:0}))
print (df)
age_diff result
0 1 0
1 1 1
2 1 0
3 0 1
另一种解决方案 - 而是将地图转换为bool
并按~
反转:
mask = df['age_diff'] < 0
df['age_diff'] = df['age_diff'].abs()
df['result'] = df['result'].mask(mask, ~(df['result'].astype(bool)))
print (df)
age_diff result
0 1 0
1 1 1
2 1 0
3 0 1
答案 1 :(得分:2)
您可以采用的另一种方法是应用函数:
def magic(row):
if abs(row['age_diff']) != row['age_diff']:
row['age_diff'] = abs(row['age_diff'])
row['result'] = 1 - row['result']
return row
df = df.apply(magic,axis=1)
答案 2 :(得分:1)
我得到age_diff
与np.sign
的迹象并从那里进行操纵。
s = np.sign(df.age_diff.values)
df.age_diff *= s
df.result -= (s == -1)
print(df)
age_diff result
0 1 0
1 1 0
2 0 1
答案 3 :(得分:1)
另一个使用lambda得到age_diff的abs的线性解决方案,然后如果age_diff为负则改变结果的符号。
file1 file3
file2 file4