Pandas如何实现Action在Dialogue前时,将Action时间线设为Dialogue时间线
Pandas 行条件赋值问题解决方案
需求说明
仅当DataFrame的Type列取值为Action的行排在取值为Dialogue的行之前时,将Action行对应的Timeline字段值设置为后续Dialogue行的Timeline值。
原代码核心问题
- 条件逻辑错误:你写的判断语句是校验同一行的Type同时等于
Action和Dialogue,逻辑不可能成立,也没有体现「行先后顺序」的要求 - 赋值逻辑错误:代码仅把整个Timeline列追加到空列表,没有将目标值回写到原DataFrame的对应行,不会修改原数据
正确实现
注意:如果你的Type列中对话类型的取值为拼写的Dialouge而非标准拼写Dialogue,请将代码中的对应字符串替换为你实际的取值。
场景1:仅处理相邻的Action+Dialogue组合
如果你的需求是只有紧挨着Dialogue前一行的Action才需要替换Timeline,用Pandas向量化操作即可,不需要循环:
# 构造判断条件:当前行是Action,下一行是Dialogue cond = (df['Type'] == 'Action') & (df['Type'].shift(-1) == 'Dialogue') # 满足条件的行,Timeline替换为下一行的Timeline值 df.loc[cond, 'Timeline'] = df['Timeline'].shift(-1)
场景2:连续多个Action后紧跟一个Dialogue,所有前置Action都复用后续Dialogue的Timeline
如果存在连续N个Action之后才出现一个Dialogue,需要把前面所有Action的Timeline都替换为这个Dialogue的值,用后向填充实现更高效:
# 提取所有Dialogue行的Timeline,其余行设为空值,再用后向填充补全空值 dialogue_timeline = df['Timeline'].where(df['Type'] == 'Dialogue').bfill() # 将填充后的值赋值给所有Action行的Timeline字段 df.loc[df['Type'] == 'Action', 'Timeline'] = dialogue_timeline
数据结构参考

内容的提问来源于stack exchange,提问作者Ahmed Abousari
相关产品推荐
相关产品推荐

