如何在Pandas DataFrame中按条件创建新列,仅显示正值ClosingBalance的SKU
解决Pandas创建条件列的问题
嘿,我来帮你搞定这个Pandas的问题!先看看你的需求和遇到的问题:
我有一个Pandas DataFrame,数据如下:
SKU ClosingBalance S1 10 S2 np.nan S3 0 S4 20我想要创建一个新列
SKU_CB,仅展示ClosingBalance为正值的SKU,其余标记为np.nan,预期结果如下:SKU ClosingBalance SKU_CB S1 10 S1 S2 np.nan np.nan S3 0 np.nan S4 20 S4我尝试了以下代码,但无法正常运行:
conditions = [(df['ClosingBalance'] > 1)] df['SKU_CB'] = np.select(conditions, df['SKU'], default=np.nan)
你的代码问题在哪?
你的代码有两个小问题:
np.select的参数格式不对:这个函数的第二个参数需要是和条件列表长度匹配的取值列表,你直接传了df['SKU'],应该把它放进一个列表里,比如[df['SKU']]。- 条件范围不符合需求:你写的是
ClosingBalance > 1,但需求是匹配所有正值(>0),而且S3的0也需要被标记为NaN,所以条件应该改成ClosingBalance > 0。
修正后的代码
方法1:修正np.select的用法
import pandas as pd import numpy as np # 先构造你的DataFrame data = {'SKU': ['S1', 'S2', 'S3', 'S4'], 'ClosingBalance': [10, np.nan, 0, 20]} df = pd.DataFrame(data) conditions = [(df['ClosingBalance'] > 0)] # 把df['SKU']放到列表里,和条件列表对应 df['SKU_CB'] = np.select(conditions, [df['SKU']], default=np.nan)
方法2:用更简洁的where方法(推荐)
Pandas的where方法专门处理这种“条件保留值,否则替换”的场景,代码更直观:
df['SKU_CB'] = df['SKU'].where(df['ClosingBalance'] > 0, np.nan)
原理很简单:当ClosingBalance > 0为真时,保留SKU列的值;当条件为假或者遇到NaN时,替换成np.nan,完全符合你的预期。
运行结果
不管用哪种方法,最终都会得到你想要的结果:
SKU ClosingBalance SKU_CB 0 S1 10.0 S1 1 S2 NaN NaN 2 S3 0.0 NaN 3 S4 20.0 S4
内容的提问来源于stack exchange,提问作者Ahamed Moosa
相关产品推荐
相关产品推荐

