如何将含全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
相关产品推荐
相关产品推荐

