Python 在循环中创建多个数据帧

Python 在循环中创建多个数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个列表,每个条目都是一个公司名称 companies = ['AA', 'AAPL', 'BA', ....., 'YHOO'] 我想为列表中的每个条目创建一个新的数据框 差不多 (伪代码) 我已经找到了一种方法来做这件事,但没有找到。有什么想法吗 您可以这样做(但如果这是面向公众的代码,显然要非常小心地使用exec) 为了强调我对@maxymoo答案的评论,将名称动态添加到Python名称空间几乎总是一个坏主意(“”)。原因有很多,最突出的是: 创建的名称可能很容易与逻辑已经使用的变量

我有一个列表,每个条目都是一个公司名称

companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想为列表中的每个条目创建一个新的数据框

差不多

(伪代码)

我已经找到了一种方法来做这件事,但没有找到。有什么想法吗

您可以这样做(但如果这是面向公众的代码,显然要非常小心地使用
exec


为了强调我对@maxymoo答案的评论,将名称动态添加到Python名称空间几乎总是一个坏主意(“”)。原因有很多,最突出的是:

  • 创建的名称可能很容易与逻辑已经使用的变量冲突

  • 由于名称是动态创建的,因此通常也会使用动态技术来检索数据

  • 这就是为什么该语言中包含了dicts。正确的方法是:

    d = {}
    for name in companies:
        d[name] = pd.DataFrame()
    
    现在,你可以写一个单独的dict理解表达式来做同样的事情,但有些人发现它可读性较差:

    d = {name: pd.DataFrame() for name in companies}
    
    一旦创建了
    d
    ,公司
    x
    DataFrame
    就可以作为
    d[x]
    检索,因此您可以很容易地查找特定的公司。要在所有公司上运行,您通常会使用以下循环:

    for name, df in d.items():
        # operate on DataFrame 'df' for company 'name'
    
    在Python2中,您可以更好地编写

    for name, df in d.iteritems():
    

    因为这样可以避免实例化
    (name,df)
    元组的列表。

    添加到上述伟大的答案中。如果您需要创建空数据帧,但如果您需要基于某些筛选创建多个数据帧,则上述操作将完美无瑕:

    假设您得到的列表是某个数据框的一列,并且您希望在较大的数据框中为每个独特的公司创建多个数据框:-

  • 首先以公司的唯一名称为例:-

    compuniquenames = df.company.unique()
    
  • 创建数据帧字典以存储数据帧

    companydict = {elem : pd.DataFrame() for elem in compuniquenames}
    
  • 以上两人已经在岗位上:

    for key in DataFrameDict.keys():
        DataFrameDict[key] = df[:][df.company == key]
    

    以上内容将为所有具有匹配记录的唯一公司提供一个数据框。

    下面是在循环中动态创建数据框的代码:

    companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
    
    for eachCompany in companies:
        #Dynamically create Data frames
        vars()[eachCompany] = pd.DataFrame()
    
    有关vars()、locals()和globals()之间的差异,请参阅以下链接:


    您希望每个公司都在自己的列中,还是所有公司都在一列中?如果您希望每个公司都有一个数据框,每个公司将包含哪些数据?在ipython笔记本中,我得到文件“”,第1行S.1=pd.DataFrame()^SyntaxError:如果我不使用循环,只使用randmo c值执行exec语句,例如format('test'),则无效的syntaxIt不起作用。错误消息表示“S.1”不是有效的变量名,因为变量不能包含标点符号。您可以尝试通过将代码更改为
    格式(c.replace('.','')
    来修复此问题。是的,我有一些公司名称中带有“.”。现在它工作了!,谢谢:)在Python名称空间中动态创建名称几乎总是一个坏主意。使用dict
    d
    和write
    d[c]=pd.DataFrame()
    更为明智。例如,阅读,开始理解为什么这是一个坏主意。好的一点,我没有想到,但你是绝对正确的。这个答案教会了我很多。我不明白为什么另一个答案被接受,而这个答案显然更好。最初的提问者的声誉分数为67,所以可能有他们想要的答案(也许它是在什么地方投入生产的!)并且不再使用Stackoverflow。可能不幸的是,公认的答案使用了
    exec
    ,但在更大的范围内,这是一个小问题——尽管感谢您说这一个更好。Stackoverflow不是我的竞争,而是一种提供有明显需求的信息的方式。感谢您的支持编辑@zx485。你能帮我一个问题吗:-我如何根据公司的所有唯一名称将字典拆分成多个数据帧?对不起,但我不是Python的人。我认为你的代码有问题。代码的最后一部分应该是:
    for key in companydict.keys():
    `companydict[key]=df[:][df.company==key]`但是在任何情况下,我都看不出它的输出是什么this@pink.slash对我来说,确切的代码是有效的,但如果还有其他用例,我很乐意看一看。
    for key in DataFrameDict.keys():
        DataFrameDict[key] = df[:][df.company == key]
    
    companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
    
    for eachCompany in companies:
        #Dynamically create Data frames
        vars()[eachCompany] = pd.DataFrame()