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

循环生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:51:17