首页 > 解决方案 > 在另一列的值的条件下将值转换为负数

问题描述

我有一个 df,如果列中的相应值不是,我想将列b中的值转换为负数。aNaN

这是我的代码:

# create a test df
df = pd.DataFrame(np.array([[12, 34], [67, 98], [np.nan, 6], [23, 45], [np.nan, 5], [5, 82], [61, 92]]), columns=['a', 'b'])

print(df)
    a   b
0   12.0    34.0
1   67.0    98.0
2   NaN     6.0
3   23.0    45.0
4   NaN     5.0


# the code to convert b to negative if a is not NaN
df['b'] = df['b'].apply(lambda x: -x if df['a'] != pd.isnull else x)

这是收到的错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

我试图查找错误代码,但我不明白发生了什么。我正在使用 lambda 但不确定是否有更好的方法。df 应如下所示:


    a   b
0   12.0    -34.0
1   67.0    -98.0
2   NaN     6.0
3   23.0    -45.0
4   NaN     5.0

标签: pythonpandasdataframe

解决方案


我将使用combine_firstwith dropna,可能会尝试 RAW ;-)

import numpy as np
import pandas as pd
df = pd.DataFrame(np.array([[12, 34], [67, 98], [np.nan, 6], [23, 45], [np.nan, 5], [5, 82], [61, 92]]), columns=['a', 'b'])
df['b'] = df.dropna()['b'].apply(lambda x: -x).combine_first(df['b'])
print(df)

输出

a     b
0  12.0 -34.0
1  67.0 -98.0
2   NaN   6.0
3  23.0 -45.0
4   NaN   5.0
5   5.0 -82.0
6  61.0 -92.0

推荐阅读