循环中数据帧的嵌套动态变量

Nested Dynamic Variables for Dataframes in Loop

我有多个 pandas 数据框,具有相同的列但不同的值。 Ind 我需要 运行 根据特定列的值进行分析。

我有 7 个数据帧可以使用,但假设我只有两个。

df1 = pd.DataFrame({'a': [0, 0.5, 0.2],
                   'b': [1,1,0.3], 'c':['A','A','B']})

df2 = pd.DataFrame({'a': [4, 1, 6],
                   'b': [6.2,0.3,0.3], 'c': ['B','A','A']})

我选择在 for 循环中使用全局变量。

我创建了:

数据需要从dflist中的df中取出,细化,最终会传递到sumlist中。

为了不迷路,我希望我的动态变量从 sumlist.

中的值中获取名称

这是我卡住的地方。我要创建的变量基于数据帧 df1、df2 的列。但是,每个动态变量的输出将包含所有列的所有值。

dflist= [df1, df2]
sumlist= ['name1', 'name2']

for i in dflist:
    for name in sumlist:
        globals()['var{name}'] = i['c'].to_list()

在这个虚拟示例中,出于某些原因,我收到以下错误:

varname1
NameError: name 'varname1' is not defined

在原始数据帧的情况下,我的列表 varname1 将给出以下结果:

['A','A','B','B','B','A']

相反,我应该有:

varname1 = ['A','A','B']
varname2 = ['B','B','A']

令我困惑的是,使用完全相同的代码,它在一种情况下“有效”(尽管是错误的),而在另一种情况下却给出错误。

我需要克服这个问题,否则我将被迫手动编写每个变量。

您缺少 f F 弦。

    globals()['var{name}'] = i['c'].to_list()

    globals()[f'var{name}'] = i['c'].to_list()

因此您的全局变量被覆盖并命名为 var{name} 而不是 varname1

还有,更好use dictionary instead of globals()

嗯,我的建议是使用字典而不是使用不安全的 globals 命令。所以而不是:

for i in dflist:
    for name in sumlist:
        globals()['var{name}'] = i['c'].to_list()

你应该这样做:

d = {}
for i, name in zip(dflist, sumlist):
    d[f'var{name}'] = i['c'].tolist()

注意我正在使用 zip 函数并行迭代两个列表。

我认为您的虚拟示例中有错误,因为您在 F 字符串的 '' 之前没有 f。

应该是这样的:

globals()[f'var{name}'] = i['c'].to_list()