如何将pandas DataFrame连续同Action值行拆分存入独立DataFrame列表
解决方法
要实现按连续相同的Action列值拆分DataFrame,只需要先构造连续分组标识,再基于该标识分组即可,核心代码如下:
# 生成连续分组标识:连续相同Action的行对应标识值相同 grouper = (df['Action'] != df['Action'].shift()).cumsum() # 按分组标识拆分,将所有子DataFrame存入列表,reset_index可重置子DF的索引为从0开始,不需要可删除 df_list = [group_df.reset_index(drop=True) for _, group_df in df.groupby(grouper)]
你可以通过print(len(df_list))查看列表长度,示例数据下会返回4,正好对应你需要的4个独立DataFrame,顺序也和连续分组的出现顺序完全一致。
实现原理
df['Action'].shift()会将Action列整体向下偏移1行,第一行偏移后为缺失值- 用
df['Action'] != df['Action'].shift()做不等比较,Action值发生变化的位置会返回布尔值True - 用
cumsum()对布尔值做累加(True等价于1,False等价于0),最终得到的序列中,连续相同Action的行会对应同一个数值,即连续分组的标识 - 基于该标识做groupby,就不会把非连续的同Action值行合并,完全符合需求
如果需要测试,可以用如下代码构造你给出的示例DataFrame:
import pandas as pd data = { 'Action': ['A0','A0','A0','A1','A1','A0','A0','A2','A2','A2','A2'], 'X1': [0.1,0.2,0.3,1.0,1.1,0.1,0.2,0.3,0.1,0.2,0.3], 'X2': [0.4,0.5,0.6,1.2,1.5,0.4,0.5,0.6,0.4,0.5,0.6], 'X3': [0.7,0.8,0.9,1.3,1.6,0.7,0.8,0.9,0.7,0.8,0.9] } df = pd.DataFrame(data)
内容的提问来源于stack exchange,提问作者Mejdi Dallel
相关产品推荐
相关产品推荐

