Python for循环生成';无法插入{},已存在';错误取决于数据帧定义

Python for循环生成';无法插入{},已存在';错误取决于数据帧定义,python,pandas,dataframe,for-loop,Python,Pandas,Dataframe,For Loop,我有一系列天文观测数据,这些数据被放入每个观测年(即df2015、df2016等)的程序生成的数据帧中。这些数据帧需要在后续过程中进行修改,我将所有这些数据帧都放在列表中。用于定义列表的方法会有所不同。明确定义的列表 dfs = [df2015, df2016, df2017, df2018, df2019] 允许对df进行进一步修改,但这与代码的目的不符——自动处理标准数据集,而不考虑年限。程序生成的列表 for yr in years: exec('dfs = [df' + yr

我有一系列天文观测数据,这些数据被放入每个观测年(即df2015、df2016等)的程序生成的数据帧中。这些数据帧需要在后续过程中进行修改,我将所有这些数据帧都放在列表中。用于定义列表的方法会有所不同。明确定义的列表

dfs = [df2015, df2016, df2017, df2018, df2019]
允许对df进行进一步修改,但这与代码的目的不符——自动处理标准数据集,而不考虑年限。程序生成的列表

for yr in years:
    exec('dfs = [df' + yr + ' for yr in years]')
似乎大部分时间都在工作,如:

for df in dfs:
    dfX = df.dtypes
    for index, val2 in dfX.items():
        if val2 == 'float64':
            df.iloc[:,index] = df.iloc[:,index].fillna(0).astype('int64')
,但在某些情况下失败,如:

for df in dfs:
    i=1
    for i in range(1, 13):
        ncol = i + (i-1) *2
        if i < 10:
            nmon = '0' + str(i)
        else:
            nmon = '' + str(i)
        df.insert(ncol, 'M' + nmon, nmon)
        i += 1
我尝试了列表理解而不是for循环,尝试了更改循环嵌套顺序(以防万一),等等

上述参考步骤的目的是将其转换为:


0   1   2   3   4   5   6   7   8   9   ... 15  16  17  18  19  20  21  22  23  24
0   1   713 1623    658.0   1659.0  619 1735    526.0   1810.0  439 ... 437 1903    510.0   1818.0  542 1725    618.0   1637.0  654 1613
1   2   714 1624    657.0   1700.0  618 1736    525.0   1812.0  438 ... 438 1902    511.0   1816.0  543 1724    619.0   1636.0  655 1613
2   3   714 1625    655.0   1702.0  616 1737    523.0   1813.0  437 ... 439 1901    512.0   1814.0  544 1722    620.0   1635.0  656 1612
3   4   714 1626    654.0   1703.0  614 1738    521.0   1814.0  435 ... 440 1900    513.0   1813.0  545 1720    622.0   1634.0  657 1612
4   5   713 1627    653.0   1704.0  613 1739    520.0   1815.0  434 ... 441 1859    514.0   1811.0  546 1719    623.0   1633.0  658 1612
进入这个


    0   M01 D01 1   2   M02 D02 3   4   M03 ... 19  20  M11 D11 21  22  M12 D12 23  24
0   1   01  1   713 1623    02  1   658 1659    03  ... 542 1725    11  1   618 1637    12  1   654 1613
1   2   01  2   714 1624    02  2   657 1700    03  ... 543 1724    11  2   619 1636    12  2   655 1613
2   3   01  3   714 1625    02  3   655 1702    03  ... 544 1722    11  3   620 1635    12  3   656 1612
3   4   01  4   714 1626    02  4   654 1703    03  ... 545 1720    11  4   622 1634    12  4   657 1612
4   5   01  5   713 1627    02  5   653 1704    03  ... 546 1719    11  5   623 1633    12  5   658 1612

我相信你们每年都在开发包含重复元素的列表

for yr in years:
    exec('dfs = [df' + yr + ' for yr in years]')
列表理解中的yr由for块迭代——这意味着列表理解中的yr的
年数
只需为原始列表
年数
中的项目写入表示df的相同字符串即可。这会导致在重复字符串列表上循环,并尝试将列插入到刚刚插入这些列的数据帧中。相反,尝试不使用for循环的列表理解


dfs=['df'+str(年)表示年数]

您可以创建去年数据帧的副本列表。如果您的年份列表是例如
['2015'、'2016'、'2017'、'2018']
,则您将生成一个dfs作为
[df2018、df2018、df2018、df2018]
,这将导致错误

这将得到正确的结果:

dfs = [eval('df' + yr) for yr in years]

它形成所需的数据帧名称并对其求值,这样您就可以得到数据帧列表。

谢谢您的建议。我早就试过了。这将生成一个带有df名称的字符串列表,以及dfs中df的格式为```的所有后续循环:``停止工作太棒了!这很有效。你介意简单地提一下原因吗?dfs在打印时似乎是相同的,这是我开始使用的两个定义之一,或者是您的定义。
dfs = [eval('df' + yr) for yr in years]