我有以下数据框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'])
有更好的方法吗?
答案 0 :(得分:4)
一个想法是测试每行是否至少有一个0
,然后用DataFrame.mask
用sum
替换值:
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