Pandas按另一列条件设置行值 不满足条件时保留原值实现方法
Pandas 按时间条件替换列值实现方案
问题说明
现有共455行的时序DataFrame,每行对应间隔为4小时的日周期时序数据,示例如下:
需求逻辑:当timestamp列的时间小时数为23时,将对应行的目标列(需求中为demand列,原测试代码误写为value)值替换为0,其余行的值保持不变。
原尝试代码的问题:
datadf['value']=datadf['timestamp'].apply(lambda x, y=datadf['value']: 0 if x.hour==23 else y)
该写法中传入lambda的参数y是整个value列的Series对象,并非当前行对应的单个原值,因此else分支返回结果完全不符合预期。
实现方案
方案1:布尔索引向量化赋值(首推)
这是pandas场景下的最优写法,不需要手动处理不满足条件的行原值保留逻辑,pandas只会修改命中条件的行,其余行数据完全不受影响,且性能远高于逐行遍历的apply写法。
- 首先确保
timestamp列为datetime类型,若不是先做类型转换:
import pandas as pd datadf['timestamp'] = pd.to_datetime(datadf['timestamp'])
- 直接定位符合条件的行赋值即可:
# 若目标列名是value,把代码里的demand替换为value即可 datadf.loc[datadf['timestamp'].dt.hour == 23, 'demand'] = 0
方案2:逐行apply写法(不推荐)
如果一定要用apply实现,需要对整个DataFrame按行遍历(指定axis=1),才能在lambda中取到当前行的对应列原值:
datadf['demand'] = datadf.apply(lambda row: 0 if row['timestamp'].hour == 23 else row['demand'], axis=1)
注意:该写法为逐行遍历执行,性能远差于向量化方案,仅作为语法参考,日常使用优先选方案1。
内容的提问来源于stack exchange,提问作者Nuevakenia
相关产品推荐
相关产品推荐

