Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 如何使用名称作为字符串在多个数据帧上循环/迭代_Pandas_Loops_Dataframe - Fatal编程技术网

Pandas 如何使用名称作为字符串在多个数据帧上循环/迭代

Pandas 如何使用名称作为字符串在多个数据帧上循环/迭代,pandas,loops,dataframe,Pandas,Loops,Dataframe,我有一些数据帧 df_1 df_2 … df_99 df_100 在此基础上,我希望迭代以对特定列执行一些操作,比如列a,它存在于每个数据帧中 我可以使用 for i in range (1,101): ’df_’+str(i) 但是当我尝试使用这些来访问像这样的数据帧时 for i in range (1,101): df_x = ’df_’+str(i) df_x['Column_A’].someoperation(i) # the operation i

我有一些数据帧

df_1
df_2
…
df_99
df_100
在此基础上,我希望迭代以对特定列执行一些操作,比如列a,它存在于每个数据帧中

我可以使用

for i in range (1,101):
    ’df_’+str(i)
但是当我尝试使用这些来访问像这样的数据帧时

for i in range (1,101):
    df_x = ’df_’+str(i)
    df_x['Column_A’].someoperation(i)
    # the operation involves the number of the dataframe
我得到一个类型错误:“字符串索引必须是整数”

我进行了广泛的搜索,针对这类问题的建议解决方案是创建一个字典,其中数据帧的名称作为键,实际数据帧作为关联值

然而,出于两个或三个原因,我不想继续这样做: 首先,由于我对pandas还比较陌生,我不确定如何处理数据帧中的特定列,该列作为值放在字典中。 此外,如果我理解正确,将数据帧放入字典将创建它们的副本,如果数据帧非常多或数据帧很大,这并不理想

但最重要的是,由于我不知道如何迭代名称,所以将数据帧放入字典中必须手动完成,因此在某种程度上仍然是相同的问题

我尝试创建一个包含要循环的数据帧名称的列表

df_list= [ ]

for i in range (1,101):
    df_list.append('df_‘+str(i))

for df in df_list: 
    df['Column_A’].someoperation
但这种方法会导致与上面相同的类型错误,并且我不能方便地在某些操作中涉及数据帧的数量

显然,pandas确实将df_1、df_2等作为字符串,而不是作为我想要访问的现有数据帧的名称,但我不知道如何告诉它这样做


任何关于如何解决这一问题的建议都将不胜感激。

您正在定义一个字符串列表,但您并没有向Python提供任何方式来知道df_1以某种方式连接到df_1

为了回答您的问题,您正在寻找eval函数,它接受一个字符串,将其作为代码执行,并返回输出

但是,您应该采纳您得到的建议,使用字典或列表。将数据帧放入字典中肯定不会创建它们的副本。字典只是从一组字符串到内存中相应对象的映射。这也是一个更优雅的解决方案,可以保留所有相关的数据帧无需遵守严格的命名约定,就可以在某种程度上避免混乱

如果您真的不需要每个数据帧的名称,只希望它们可以一起访问,一个更简单的解决方案是将它们放在一个列表中,并作为dfs[0]-dfs[100]访问每个数据帧

如果您已经按照您所描述的方式加载了df_1-df_100,eval将允许您将它们组织到一个地方,如:dfs=[evaldf_+stri for i in range1101]或dfs={i:evalfdf_{i}for i in range1101}

最后,您可以以正常方式访问列并对通过列表和字典访问的数据帧执行操作

dfs[0]['column 1'] = 1.
means = dfs[40].groupby('date').mean()
#~ ect.

非常感谢您,eval确实正是我在这里需要的!这个问题让我头痛了两天。数据帧已经给出并命名了,而且由于操作涉及数据帧的数量,这种方法对我来说似乎很自然。很高兴知道没有为字典创建副本。还感谢您对addre的提示现在,我仍在学习如何使用熊猫。很高兴它成功了。将它们作为df[3]保存在字典中会更加方便和高效,而不是尝试使用str和eval在字符串、整数和变量名之间来回转换,尤其是因为这迫使您将后缀数字硬编码到代码中。例如,如果以后您获得了df_101或删除了df_50,则必须手动修改Range1101,而您可以直接循环字典对。
dfs[0]['column 1'] = 1.
means = dfs[40].groupby('date').mean()
#~ ect.