循环创建多个数据框
- 2024-12-20 08:38:00
- admin 原创
- 80
问题描述:
我有一个列表,每个条目都是一个公司名称
companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想为列表中的每个条目创建一个新的数据框。
类似于
(伪代码)
for c in companies:
c = pd.DataFrame()
我已经搜索过如何实现此目的,但找不到。有什么想法吗?
解决方案 1:
只是为了强调我对 @maxymoo 的回答的评论,向 Python 命名空间动态添加名称几乎总是一个坏主意(“代码异味”)。 有许多原因,其中最突出的是:
创建的名称可能很容易与逻辑中已经使用的变量冲突。
由于名称是动态创建的,因此您通常也会使用动态技术来检索数据。
这就是该语言中包含字典的原因。正确的做法是:
d = {}
for name in companies:
d[name] = pd.DataFrame()
现在你可以编写一个字典理解表达式来做同样的事情,但是有些人发现它的可读性较差:
d = {name: pd.DataFrame() for name in companies}
一旦d
创建了DataFrame
for 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:
除了上述出色的答案之外,如果您需要创建空数据框,上述方法将完美无缺,但如果您需要根据某些过滤创建多个数据框:
假设您获得的列表是某个数据框的一列,并且您想为每个唯一的公司创建多个数据框,以形成更大的数据框:-
首先取公司独特的名称:-
compuniquenames = df.company.unique()
创建数据框字典来存储数据框
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)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件