遍历pandas DataFrame列表字段 删除首次出现1后的所有元素
报错原因
你在循环中每次迭代都直接对df['events_short']整列赋值当前行截断后的列表,截断后的列表长度和DataFrame的行数不匹配,因此触发长度不匹配的报错。
正确实现方案
推荐使用Series.apply方法实现需求,是pandas针对列处理的原生方法,代码更简洁,数据量较大时运行效率比手动遍历行高很多:
import pandas as pd df = pd.DataFrame([['00000000000 ', [4, 5, 5, 3, 2, 1, 5]], ['00000000001', [4, 5, 5, 1, 2, 1, 5, 5, 5]], ['00000000002 ', [4, 5, 1, 3, 2, 1, 5, 5, 5, 1]]], columns=['session_id', 'events']) def truncate_event(lst): # 先判断列表中是否存在1,避免不存在时报错 if 1 in lst: idx = lst.index(1) return lst[:idx] # 如果没有1,默认返回原列表,可根据需求调整为返回空列表等 return lst df['events_short'] = df['events'].apply(truncate_event)
如果你想要修改原有的循环写法,只需要给对应行的位置赋值即可:
df['events_short'] = None for i, row in df.iterrows(): if 1 in row['events']: target_id = row['events'].index(1) df.loc[i, 'events_short'] = row['events'][:target_id] else: df.loc[i, 'events_short'] = row['events']
运行结果示例
处理后events_short列的输出如下:
| session_id | events_short |
|---|---|
| 00000000000 | [4, 5, 5, 3, 2] |
| 00000000001 | [4, 5, 5] |
| 00000000002 | [4, 5] |
内容的提问来源于stack exchange,提问作者Oldbighorn
相关产品推荐
相关产品推荐

