如何基于Scenario列非空值动态拆分Python DataFrame
解决按Scenario列非空值拆分DataFrame的问题
先看你原代码里的几个问题:
df.dropna(how='all')没生效,因为这个方法默认返回新DataFrame,不会修改原数据,得改成df = df.dropna(how='all')或者加inplace=True。- 直接用
df['Scenario'].notna分组是错的,notna是方法,要加括号df['Scenario'].notna(),而且这么分组只会得到“非空”和“空”两组,不是你要的每个非空Scenario对应一个子集。
正确的做法是先给每个Scenario块生成唯一标识,再按标识分组:
import pandas as pd # 读取Excel,注意sheet_name如果是变量要确认test已定义,或者用字符串 df = pd.read_excel(excel_fp, sheet_name=test, header=None) df.rename(columns={df.columns[0]: 'Scenario'}, inplace=True) # 修正dropna,保留有效行 df = df.dropna(how='all') # 生成分组标识:Scenario非空的位置标记为新组,其余用ffill填充 df['group_id'] = df['Scenario'].notna().cumsum() # 按group_id分组,过滤掉全为空Scenario的组 splitted_dfs = [group for _, group in df.groupby('group_id') if not group['Scenario'].isna().all()] # 可选:删除临时的group_id列 for sub_df in splitted_dfs: sub_df.drop(columns='group_id', inplace=True)
关键步骤说明:
df['Scenario'].notna().cumsum():每次遇到Scenario非空的行,累加值就加1,这样同一个Scenario下方的所有行都会拥有相同的group_id,自然形成一个独立子集。- 最后的过滤操作是为了避免出现全为空Scenario的无效分组(比如文件首尾未清理干净的空行)。
内容的提问来源于stack exchange,提问作者z star
相关产品推荐
相关产品推荐

