You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中按分组向后填充至stop标识并拆分分组DataFrame

问题解决方案

一、按genre分组填充id列

需求是每个genre组内,把"stop"位置之前的空值全部替换为"stop","stop"之后的空值保持不变。可以用分组结合累积最大值实现,无需循环:

import pandas as pd

# 原始DataFrame
df = pd.DataFrame(data = {'genre': ['sci-fi','sci-fi','sci-fi','sci-fi','sci-fi', 'comedy', 
                                   'comedy', 'comedy', 'comedy', 'comedy', 'comedy', 'comedy'],
                           'score': [5,5,4,3,2,9,10,8,4,7,5,6], 
                            'id': ["","","","stop","", "", "stop", "", "", "", "", ""]})

# 分组处理id列
df['id'] = df.groupby('genre')['id'].apply(
    lambda x: x.eq('stop')[::-1].cummax()[::-1].map({True: 'stop', False: ''})
)

运行后得到的结果和你给出的目标DataFrame完全一致。

代码逻辑说明

  • x.eq('stop'):把id列转成布尔值,"stop"对应True,空字符串对应False
  • [::-1]:反转序列,从后往前计算累积最大值,这样能保证"stop"位置及之前的所有值都被标记为True,之后的保持False
  • cummax():计算累积最大值,会把True向前传递
  • 再次反转回原顺序,最后用map把布尔值转回对应的字符串

二、无需for循环拆分DataFrame为子DataFrame

有两种简便方法:

方法1:生成分组字典

用字典推导式结合groupby,一次性把所有genre的子DataFrame存到字典里:

genre_dfs = {genre: group for genre, group in df.groupby('genre')}

之后直接通过键名调用:

  • 获取sci-fi子DataFrame:genre_dfs['sci-fi']
  • 获取comedy子DataFrame:genre_dfs['comedy']

方法2:直接提取单个genre的子DataFrame

如果只需要某一个genre的子数据,用布尔索引直接筛选:

# 获取仅包含sci-fi的DataFrame
sci_fi_df = df[df['genre'] == 'sci-fi']

内容的提问来源于stack exchange,提问作者Beans On Toast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:51:18