如何在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,之后的保持Falsecummax():计算累积最大值,会把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
相关产品推荐
相关产品推荐

