循环生成DataFrame输出NaN,如何保存迭代的2×751数据?
问题
编写了random_sample()函数,每次调用生成一个2行751列的全新DataFrame。运行以下循环代码后,得到的df_pd全为NaN,但实际已生成5组不同的2×751结构的DataFrame,需解决如何正确保存这些迭代生成的数据。
错误代码:
for g in range(5): sample = random_sample() ref = {g:sample} empt_dict.append(ref) df_pd = pd.DataFrame(empt_dict) df_pd
生成的单组DataFrame示例:
W_332 W_333 W_334 ... W_1066 W_1067 W_1068 W_1069 0 0.098432 0.094451 0.096085 ... 0.090937 0.068576 0.085326 0.095416 1 0.164170 0.197848 0.161228 ... 0.272259 0.283551 0.229989 0.230067 [2 rows x 751 columns]
错误输出结果:
0 1 2 3 4 0 NaN NaN NaN NaN NaN 1 NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN 3 NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN NaN
错误原因
你每次向empt_dict中追加的是单键字典(如{0: sample_df}),当用pd.DataFrame(empt_dict)转换时,pandas会将每个字典的键作为列名,但每个字典仅包含一个键,其余列自然填充NaN。同时,由于每个值是二维DataFrame,pandas无法将其直接解析为单元格数据,最终导致整表NaN。
解决方案
根据不同的需求,有以下几种正确的保存方式:
方式1:纵向合并并保留分组标识
将所有迭代生成的DataFrame纵向合并,同时添加分组列标记数据来源,适合后续按分组分析:
import pandas as pd dfs = [] for g in range(5): sample = random_sample() # 添加分组列,标记该数据属于第g次迭代 sample['group'] = g dfs.append(sample) # 合并所有DataFrame,重置索引 df_pd = pd.concat(dfs, ignore_index=True)
最终得到的df_pd是10行(2行×5次)、752列(751列+1分组列)的结构。
方式2:横向合并区分迭代组
将每个迭代的DataFrame横向拼接,通过列名前缀区分不同组,适合对比同位置的数据:
import pandas as pd dfs = [] for g in range(5): sample = random_sample() # 给当前组的所有列添加前缀,避免列名重复 sample = sample.add_prefix(f'group_{g}_') dfs.append(sample) # 横向合并所有DataFrame df_pd = pd.concat(dfs, axis=1)
最终得到的df_pd是2行、3755列(751列×5次)的结构,列名格式为group_0_W_332、group_1_W_332等。
方式3:保留字典结构生成嵌套DataFrame
如果需要保留每个迭代组作为独立的DataFrame对象(单元格存储子DataFrame),可以直接构建单字典而非列表:
import pandas as pd empt_dict = {} for g in range(5): empt_dict[g] = random_sample() df_pd = pd.DataFrame(empt_dict)
最终得到的df_pd是2行、5列的结构,每个单元格对应一组2×751的DataFrame,适合需要单独提取某组数据的场景。
内容的提问来源于stack exchange,提问作者domarom
相关产品推荐
相关产品推荐

