循环创建多个数据帧

Lui*_*era 16 python dataframe pandas

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

companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
Run Code Online (Sandbox Code Playgroud)

我想为列表中的每个条目创建一个新的数据帧.

就像是

(伪代码)

for c in companies:
     c = pd.DataFrame()
Run Code Online (Sandbox Code Playgroud)

我已经找到了一种方法来做到这一点,但找不到它.有任何想法吗?

hol*_*web 57

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

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

  2. 由于名称是动态创建的,因此通常最终还是使用动态技术来检索数据.

这就是为什么dicts被包含在语言中的原因.正确的方法是:

d = {}
for name in companies:
    d[name] = pd.DataFrame()
Run Code Online (Sandbox Code Playgroud)

现在你可以编写一个单独的dict理解表达式来做同样的事情,但有些人发现它不太可读:

d = {name: pd.DataFrame() for name in companies}
Run Code Online (Sandbox Code Playgroud)

一旦d创建DataFrame,公司x就可以被检索d[x],因此您可以非常轻松地查找特定公司.要对所有公司进行操作,您通常会使用如下循环:

for name, df in d.items():
    # operate on DataFrame 'df' for company 'name'
Run Code Online (Sandbox Code Playgroud)

在Python 2中,你写得更好

for name, df in d.iteritems():
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案教会了我很多. (5认同)
  • 最初的提问者的声誉得分为 67,所以可能有他们想要的答案(也许它在某个地方投入生产!)并且不再使用 Stackoverflow。可能不幸的是,接受的答案使用了`exec`,但在更大的方案中,这是一个小问题 - 尽管感谢您说这个更好。Stackoverflow 对我来说不是一种竞争,而是一种提供有明显需求的信息的方式。 (4认同)
  • 好的,我没有想到这一点,但你是绝对正确的. (3认同)
  • 我不明白为什么另一个答案被接受,而这个答案显然更好。 (3认同)

max*_*moo 10

你可以做到这一点(尽管exec如果这将成为面向公众的代码,显然会非常谨慎地使用)

for c in companies:
     exec('{} = pd.DataFrame()'.format(c))
Run Code Online (Sandbox Code Playgroud)

  • 在Python命名空间中动态创建名称几乎总是一个坏主意.使用dict`d`并编写`d [c] = pd.DataFrame()`会更明智.阅读[此答案](http://stackoverflow.com/questions/5036700/how-can-you-dynamically-create-variables-in-python-via-a-while-loop),例如,开始了解为什么这是一个坏主意. (3认同)

小智 8

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

companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']

for eachCompany in companies:
    #Dynamically create Data frames
    vars()[eachCompany] = pd.DataFrame()
Run Code Online (Sandbox Code Playgroud)

vars()、locals() 和 globals() 之间的区别请参考以下链接:

globals()、locals() 和 vars() 之间有什么区别?


ak3*_*191 5

除了上述出色的答案之外。如果您需要创建空的数据框,但是需要基于一些过滤来创建多个数据框,则上面的方法就可以完美地工作:

假设您得到的列表是某个数据框的一列,并且您想为更大的数据框的每个唯一公司创建多个数据框:-

  1. 首先以公司的唯一名称:

    compuniquenames = df.company.unique()
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建数据框字典以存储数据框

    companydict = {elem : pd.DataFrame() for elem in compuniquenames}
    
    Run Code Online (Sandbox Code Playgroud)

以上两个已经发布:

for key in DataFrameDict.keys():
    DataFrameDict[key] = df[:][df.company == key]
Run Code Online (Sandbox Code Playgroud)

上面将为您提供所有具有匹配记录的独特公司的数据框。

  • 我认为你的代码有问题。代码的最后一部分应该是:`for key in companydict.keys():``companydict[key] = df[:][df.company == key]`但无论如何我都看不到输出到底是什么这个的 (2认同)