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

如何将含全NaN行的Pandas DataFrame拆分为多个独立DataFrame

按全NaN行拆分DataFrame并生成独立DataFrame

第一步:拆分并过滤空DataFrame

你原有的拆分代码会生成包含全NaN空DataFrame的列表,先把这些无效项过滤掉:

import pandas as pd
import numpy as np

# 构造原始DataFrame
data = [['M', 'A', '0', '0.2', '0.2', '0.2'],
        [np.nan, np.nan, np.nan, '0.3', '0.3', '1'],
        [np.nan, np.nan, np.nan, '1.4', '3.2', '32'],
        [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
        [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
        ['sex', 'test', 'conc', 'sugar', 'flour', 'yeast'],
        ['M', 'A', '3', '1.2', '1.2', '1.2'],
        [np.nan, np.nan, np.nan, '1.3', '1.3', '2'],
        [np.nan, np.nan, np.nan, '2.4', '4.2', '33'],
        [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
        ['sex', 'test', 'conc', 'sugar', 'flour', 'yeast'],
        ['M', 'A', '6', '2.2', '2.2', '2.2'],
        [np.nan, np.nan, np.nan, '2.3', '2.3', '3'],
        [np.nan, np.nan, np.nan, '3.4', '5.2', '34']]
df = pd.DataFrame(data)

# 拆分DataFrame
df_list = np.split(df, df[df.isnull().all(1)].index)
# 过滤掉全为空的DataFrame
df_list = [d for d in df_list if not d.isnull().all().all()]

第二步:生成独立DataFrame

有两种实用方式:

方式1:手动赋值(适合数量固定的情况)

直接按列表索引将每个子DataFrame赋值给独立变量:

df1 = df_list[0]
df2 = df_list[1]
df3 = df_list[2]

之后即可通过df1、df2、df3直接访问对应的独立DataFrame。

方式2:批量生成(适合数量不确定的情况)

用字典存储,还能自动命名,灵活度更高:

# 生成带序号命名的DataFrame字典
dfs = {f'dataset_{i+1}': sub_df for i, sub_df in enumerate(df_list)}

# 可选:将字典中的键转为全局变量,直接用变量名访问
for name, sub_df in dfs.items():
    globals()[name] = sub_df

执行后可以直接用dataset_1、dataset_2这类变量名调用对应的DataFrame。

可选:清理子DataFrame(设置表头)

你的子DataFrame包含表头行(如['sex', 'test', 'conc', 'sugar', 'flour', 'yeast']),可以批量将其设为正式表头并清理无效行:

def clean_sub_dataframe(sub_df):
    # 定位表头行(第一个非全NaN行)
    header_row_idx = sub_df[~sub_df.isnull().all(1)].index[0]
    # 设置表头
    sub_df.columns = sub_df.loc[header_row_idx]
    # 保留表头行之后的数据并重置索引
    sub_df = sub_df[sub_df.index > header_row_idx].reset_index(drop=True)
    return sub_df

# 批量处理所有子DataFrame
cleaned_datasets = [clean_sub_dataframe(df) for df in df_list]

处理后的每个子DataFrame就具备规范的表头和数据行。


内容的提问来源于stack exchange,提问作者Steve..Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:55:19