Python熊猫。替换列

时间:2017-05-25 07:52:15

标签: python pandas

假设我有一个像这样的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

任何人都可以指出我如何实现这一目标?

4 个答案:

答案 0 :(得分:5)

dict使用abs + mask + map

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_diffnp.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
相关问题