如何用Pandas新增responder列,按指定events列范围标记y/n
解决Pandas批量判断events列生成responder列的问题
核心代码实现
import pandas as pd # 模拟你的原始DataFrame data = { 'Animal_ID': ['a1', 'a2', 'a3', 'a4'], 'weight': [50, 52, 75, 53], 'Project': ['p1', 'p2', 'p1', 'p2'], 'Exp_type': ['Acute', 'chronic', 'Acute', 'chronic'], 'researcher': ['alex', 'mat', 'alex', 'mat'], 'events_d1': [0, 0, 1, 0], 'events_d2': [0, 1, pd.NA, pd.NA], 'events_d3': [0, 1, 2, pd.NA], 'events_d4': [4, 5, pd.NA, 0] } df = pd.DataFrame(data) # 1. 先填充缺失值(原数据里的空白单元格会被识别为缺失值,不处理会影响判断) target_events = df.filter(regex='events_d[1-3]').fillna(0) # 2. 批量判断每行是否有大于0的值,生成responder列 df['responder'] = target_events.gt(0).any(axis=1).map({True: 'y', False: 'n'}) print(df)
分步说明
- 批量选列:用
df.filter(regex='events_d[1-3]')直接匹配events_d1、events_d2、events_d3,比先选所有events_d列再删除events_d4更直接,也符合你要求的批量选择逻辑。 - 缺失值处理:原数据里的空白单元格在Pandas中是缺失值(
NaN/pd.NA),直接判断会出错,所以用fillna(0)把空值替换成0,确保数值判断准确。 - 生成标记列:
gt(0)将每个单元格与0比较,返回布尔值;any(axis=1)检查每行是否存在至少一个True(即有值大于0);最后用map把布尔值转成y/n。
运行结果
Animal_ID weight Project Exp_type researcher events_d1 events_d2 events_d3 events_d4 responder 0 a1 50 p1 Acute alex 0 0.0 0.0 4.0 n 1 a2 52 p2 chronic mat 0 1.0 1.0 5.0 y 2 a3 75 p1 Acute alex 1 0.0 2.0 NaN y 3 a4 53 p2 chronic mat 0 0.0 0.0 0.0 n
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

