循环创建多个数据帧

时间:2015-06-04 04:48:04

标签: python pandas dataframe

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

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

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

这样的东西

(伪代码)

for c in companies:
     c = pd.DataFrame()

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

4 个答案:

答案 0 :(得分:46)

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

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

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

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

    d = {}
    for name in companies:
        d[name] = pd.DataFrame()
    

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

    d = {name: pd.DataFrame() for name in companies}
    

    创建d后,公司DataFrame的{​​{1}}可以检索为x,因此您可以非常轻松地查找特定公司。要对所有公司进行操作,您通常会使用如下循环:

    d[x]

    在Python 2中,你最好写

    for name, df in d.items():
        # operate on DataFrame 'df' for company 'name'
    

    因为这可以避免实例化for name, df in d.iteritems(): 元组列表。

答案 1 :(得分:7)

你可以这样做(尽管如果这将是面向公众的代码,显然要谨慎使用exec

for c in companies:
     exec('{} = pd.DataFrame()'.format(c))

答案 2 :(得分:3)

除了上述出色的答案外。如果您需要创建空的数据框,但需要基于一些过滤来创建多个数据框,则上面的方法会完美无缺:

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

  1. 首先采用公司的唯一名称:-

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

    companydict = {elem : pd.DataFrame() for elem in compuniquenames}
    

以上两个已经在帖子中:

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

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

答案 3 :(得分:1)

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

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

for eachCompany in companies:
    #Dynamically create Data frames
    vars()[eachCompany] = pd.DataFrame()

vars(),locals() 和 globals() 的区别参考以下链接:

What's the difference between globals(), locals(), and vars()?