循环创建多个数据框

2024-12-20 08:38:00
admin
原创
177
摘要:问题描述:我有一个列表,每个条目都是一个公司名称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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2525  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1542  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Filestage、Xebrio、Kintone、Monday、Celoxis、Backlog、BubblePPM、Plutio、Scoro。在当今快速变化的商业环境中,项目管理系统的选择成为企业成功的关键因素之一。许多企业在选购项目管理系统时,常常面临功能复杂、...
项目管理系统   0  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Plutio、Kantata、Kintone、LiquidPlanner、Motion、Smartsheet、Targa、QuickBase、Hive。在当今快节奏的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而,面对市...
开源项目管理软件   15  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Scoro、Wekan、Hubstaff、Kintone、Wrike、Filestage、Trello、Airtable、Paymo。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时常常面临诸多挑战,如任务分...
项目管理系统   7  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用