You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于DataFrame的value列生成active与unactive衍生列?

没问题,这事儿用Pandas处理起来超简单,我给你两种实用的实现方案,你可以根据自己的数据集大小和偏好来选~

先明确需求回顾

我们需要给现有的df添加两列:

  • active:当value≥0时取值1,value为NaN时取值0
  • unactive:当value≥0时取值0,value为NaN时取值-1

方案1:用numpy.where(高效矢量化操作,推荐大数据集)

这种方式是矢量化运算,比循环或apply快得多,适合处理大规模数据:

首先导入依赖库(如果还没导的话):

import pandas as pd
import numpy as np

然后直接给DataFrame添加新列:

# 添加active列
df['active'] = np.where(df['value'] >= 0, 1, 0)
# 添加unactive列
df['unactive'] = np.where(df['value'] >= 0, 0, -1)

原理:np.where会逐个判断条件df['value'] >=0,因为NaN和任何数值比较都会返回False,刚好符合我们要把NaN映射为0/-1的需求。

方案2:用apply(逻辑直观,适合小数据集)

如果你的数据集不大,或者想要更直观的逻辑写法,可以用apply配合lambda函数:

df['active'] = df['value'].apply(lambda x: 1 if pd.notna(x) and x >= 0 else 0)
df['unactive'] = df['value'].apply(lambda x: 0 if pd.notna(x) and x >= 0 else -1)

这里我们明确判断了pd.notna(x),逻辑更清晰,不容易出错。

测试示例与结果

我先构造一个和你描述一致的示例DataFrame:

data = {'value': [0.0, 3.4, np.nan, 0.0, np.nan, 1.0]}
index = pd.to_datetime(['2014-05-21 10:00:00', '2014-05-21 11:00:00', 
                        '2014-05-21 12:00:00', '2014-05-21 13:00:00', 
                        '2014-05-21 14:00:00', '2014-05-21 15:00:00'])
df = pd.DataFrame(data, index=index)

运行上面的代码后,得到的df(也就是你要的df_new)会是这样:

value  active  unactive
2014-05-21 10:00:00    0.0       1         0
2014-05-21 11:00:00    3.4       1         0
2014-05-21 12:00:00    NaN       0        -1
2014-05-21 13:00:00    0.0       1         0
2014-05-21 14:00:00    NaN       0        -1
2014-05-21 15:00:00    1.0       1         0

内容的提问来源于stack exchange,提问作者Chi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:34:17