python - 基于忽略缺失值的多个条件的新列

标签 python pandas numpy

我有以下带有一些缺失值的数据框:

       A     B
0  63.0   9.0
1   NaN  35.0
2  51.0  95.0
3  25.0  11.0
4  91.0   NaN
5   2.0  47.0
6  37.0  10.0
7   NaN  88.0
8  75.0  87.0
9  92.0  21.0

我想根据以上两列的条件创建一个新列:

df['C'] = numpy.where((df['A']>55) | (df['B']>55), "Yes", "No")

这有效但没有考虑缺失值:

      A     B    C
0  63.0   9.0  Yes
1   NaN  35.0   No
2  51.0  95.0  Yes
3  25.0  11.0   No
4  91.0   NaN  Yes
5   2.0  47.0   No
6  37.0  10.0   No
7   NaN  88.0  Yes
8  75.0  87.0  Yes
9  92.0  21.0  Yes

为了纠正缺失值,我必须运行以下代码:

df['C'] = numpy.where((df['A'].isnull()) | (df['B'].isnull()), numpy.nan, df['C'])

然后我得到适当的新专栏:

      A     B    C
0  63.0   9.0  Yes
1   NaN  35.0  NaN
2  51.0  95.0  Yes
3  25.0  11.0   No
4  91.0   NaN  NaN
5   2.0  47.0   No
6  37.0  10.0   No
7   NaN  88.0  NaN
8  75.0  87.0  Yes
9  92.0  21.0  Yes

有没有更好的方法可以让我仅在单行代码中更正缺失值?

最佳答案

使用 np.select。条件的顺序在这里很重要,因为 np.select 选择第一个有效选项,所以您必须先进行 null 检查。

c1 = df.isnull().any(1)
c2 = df.gt(55).any(1)

df['C'] = np.select([c1, c2], [np.nan, 'Yes'], 'No')

      A     B    C
0  63.0   9.0  Yes
1   NaN  35.0  nan
2  51.0  95.0  Yes
3  25.0  11.0   No
4  91.0   NaN  nan
5   2.0  47.0   No
6  37.0  10.0   No
7   NaN  88.0  nan
8  75.0  87.0  Yes
9  92.0  21.0  Yes

关于python - 基于忽略缺失值的多个条件的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51699376/

相关文章:

python - 改变QTableView的滚动方向

python - 绘制多条 3D 线 : data transformation

python - 从 NumPy 数组中删除值对

python - 如何使用 Python 2.7(可能还有 pyserial)在 Linux 中检查串口是否已经打开(由另一个进程打开)?

python - 给定一个带有元组键的 python 字典,正确格式化字符串

python - Pandas 申请() : how to multiply selected columns based on string match and return complete dataframe

python - 反转 DataFrame 中的单个列

python - 仅替换数据框中列的第一个字符

python - 当每个 csv 具有多个公共(public)列时,如何最好地将多个 csv 读入单个数据帧

python - 使用 Python 创建非线性回归