循环创建多个数据框

2024-12-20 08:38:00
admin
原创
80
摘要:问题描述:我有一个列表,每个条目都是一个公司名称companies = ['AA', 'AAPL', 'BA', ....., 'YHOO'] 我想为列表中的每个条目创建一个新的数据框。类似于(伪代码)for c in companies: c = pd.DataFrame() 我已经搜索过如何实现...

问题描述:

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

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

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

类似于

(伪代码)

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

我已经搜索过如何实现此目的,但找不到。有什么想法吗?


解决方案 1:

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

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

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

这就是该语言中包含字典的原因。正确的做法是:

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

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

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

一旦d创建了DataFramefor company,x就可以将其检索为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)因为这样可以避免实例化旧版本中创建的元组列表.items()。现在这主要是历史问题,尽管当然还会有 Python 2 应用程序存在并且需要(希望是偶尔)维护。

解决方案 2:

你可以这样做(但exec如果这是面向公众的代码,则必须格外小心)

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

解决方案 3:

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

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

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

有关 vars()、locals() 和 globals() 之间的区别,请参阅以下链接:

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

解决方案 4:

除了上述出色的答案之外,如果您需要创建空数据框,上述方法将完美无缺,但如果您需要根据某些过滤创建多个数据框:

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

  1. 首先取公司独特的名称:-

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

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

上面两个已经在帖子里了:

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

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

解决方案 5:

你可以这样做:

for xxx in yyy:
   globals()[f'dataframe_{xxx}'] = pd.Dataframe(xxx)

解决方案 6:

以下是可重现的 -> 假设您有一个包含 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"]来获取字典中的数据框。
如果您需要对数据框进行更“独特”的命名,我认为您必须使用例如if 条件,例如:

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']并且可以让您更好地控制数据框名称和列名称(如果这很重要)。

解决方案 7:

老话题了,但我认为我对此有同样的看法。

我理解动态创建 DF 的目标,但简单地调用一个与所需表匹配的变量的方法是更好的吗?

是的,虽然多了几行代码,但可能更容易调试。

import pandas as pd

companies = ['AA', 'AAPL', 'BA', 'YHOO']
dummy_data = {'col1': [1, 2], 'col2': [3, 4]}

df_aa = companies[0] = pd.DataFrame(data=dummy_data)
df_ba = companies[2] = pd.DataFrame(data=dummy_data)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   984  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   0  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   0  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   0  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用