如何基于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
相关产品推荐
相关产品推荐

