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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:20:31