有条件地创建新的dataframe列以显示现有列的内容

2024-09-28 18:54:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,上面写着

SKU  ClosingBalance
S1       10
S2       np.nan
S3       0
S4       20

我想创建一个新的列,它将只显示具有正期末余额的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)

不起作用。我需要你的帮助


Tags: 数据标记dfs3npnanselectconditions
2条回答

可以使用^{}执行此操作:

df['SKU_CB'] = np.where(df['ClosingBalance'] > 1, df['SKU'], np.nan)

或者,在使用^{}时,第二个参数似乎有问题:

choicelist : list of ndarrays The list of arrays from which the output elements are taken. It has to be of the same length as condlist.

所以应该是这样

df['SKU_CB'] = np.select(conditions, [df['SKU']], default=np.nan)

所以你的数据确实包含带有nan的数字数据,所以这就足够了-

pd.Series.mask/where

df['SKU_CB'] = df.SKU.where(df.ClosingBalance.gt(0))

或者

df['SKU_CB'] = df.SKU.mask(~df.ClosingBalance.gt(0))

df
  SKU  ClosingBalance SKU_CB
0  S1            10.0     S1
1  S2             NaN    NaN
2  S3             0.0    NaN
3  S4            20.0     S4

如果碰巧,您的数据有不完全是NaN的NaN值,那么这里有一个替代方法。使用pd.to_numeric,确定哪些值无效,并使用该值屏蔽SKU

pd.to_numericpd.Series.mask/where

df['SKU_CB'] = df.SKU.mask(
    ~pd.to_numeric(df.ClosingBalance, errors='coerce').gt(0)
)

或者

df['SKU_CB'] = df.SKU.where(
   pd.to_numeric(df.ClosingBalance, errors='coerce').gt(0)
)

df
  SKU ClosingBalance SKU_CB
0  S1             10     S1
1  S2         np.nan    NaN
2  S3              0    NaN
3  S4             20     S4

相关问题 更多 >