繁体   English   中英

在循环中创建多个数据帧

[英]Create multiple dataframes in loop

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

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

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

就像是

(伪代码)

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

我一直在寻找一种方法来做到这一点,但找不到。 有任何想法吗?

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

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

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

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

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

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

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

创建d ,公司xDataFrame可以检索为d[x] ,因此您可以很容易地查找特定公司。 要对所有公司进行操作,您通常会使用如下循环:

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

在 Python 2 中你写得更好

for name, df in d.iteritems():

因为这避免了实例化(name, df)元组列表。

你可以这样做(尽管如果这是面向公众的代码,显然要格外小心地使用exec

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

添加到上述伟大的答案。 如果您需要创建空数据框,但如果您需要基于某些过滤创建多个数据框,则上述内容将完美无缺:

假设您得到的列表是某个数据框的列,并且您想为更大的数据框为每个独特的公司制作多个数据框:-

  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]

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

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

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

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

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

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

以下是可重现的 -> 假设您有一个包含 df/company 名称的列表:

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

你可能也有数据,大概也是一个列表? (或者更确切地说是列表列表),例如:

 content_of_lists = [
 [['a', '1'], ['b', '2']],
 [['c', '3'], ['d', '4']],
 [['e', '5'], ['f', '6']],
 [['g', '7'], ['h', '8']]
]

在这个特殊的例子中,df 应该看起来非常相似,所以这不需要非常复杂:

dic={}
for n,m in zip(companies, range(len(content_of_lists))):
   dic["df_{}".format(n)] = pd.DataFrame(content_of_lists[m]).rename(columns = {0: "col_1", 1:"col_2"}) 

在这里,您必须使用dic["df_AA"]来访问字典中的数据dic["df_AA"] 但是,如果您需要对数据框进行更多“不同”的命名,我认为您必须使用if-conditions ,例如:

dic={}
    for n,m in zip(companies, range(len(content_of_lists))):
if n == 'AA':
    special_naming_1 = pd.DataFrame(content_of_lists[m]).rename(columns = {0:     
    "col_1", 1:"col_2"})
elif n == 'AAPL':
    special_naming_2 ...

这需要更多的努力,但它允许您通过编写special_naming_1而不是dic['df_AA']以更传统的方式获取数据帧对象,并且如果这很重要,您可以更好地控制数据帧名称和列名称。

你可以这样做:

对于 yyy 中的 xxx:

globals()[f'dataframe_{xxx}'] = pd.Dataframe(xxx)

:D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM