传输/切换/更改两列的值(如果一列为0 / NaN)

时间:2019-10-10 12:45:09

标签: python pandas

我有以下数据框df:

Name   A    B
Apple  0.0  22.0
Ban    1.0  0.0
Ap    -2.0  1.0

期望的结果将是:

Name   A    B    
Apple  22.0  22.0
Ban    1.0  1.0  
Ap    -2.0  1.0 

现在我正在做一个嵌套的np.where组合,它也可以工作:

df['C'] = np.where(df['A'] == 0, df['B'], df['A'])
df['C'] = np.where(df['B'] == 0, df['A'], df['B'])

有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

一个想法是测试每行是否至少有一个0,然后用DataFrame.masksum替换值:

cols = ['A','B']
df[cols] = df[cols].mask(df[cols].eq(0).any(axis=1), df.sum(axis=1), axis=0)
print (df)
    Name     A     B
0  Apple  22.0  22.0
1    Ban   1.0   1.0
2     Ap  -2.0  -1.0

您应使用DataFrame.assign更改您的解决方案,以免覆盖列:

df = df.assign(A = np.where(df['A'] == 0, df['B'], df['A']),
               B = np.where(df['B'] == 0, df['A'], df['B']))

df = df.assign(A = df['B'].where(df['A'] == 0, df['A']),
               B = df['A'].where(df['B'] == 0, df['B']))

print (df)
    Name     A     B
0  Apple  22.0  22.0
1    Ban   1.0   1.0
2     Ap  -2.0  -1.0