[英]Create multiple dataframes in loop
我有一个列表,每个条目都是一个公司名称
companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想为列表中的每个条目创建一个新的数据框。
就像是
(伪代码)
for c in companies:
c = pd.DataFrame()
我一直在寻找一种方法来做到这一点,但找不到。 有任何想法吗?
只是为了强调我对@maxymoo 的回答的评论,将名称动态添加到 Python 命名空间几乎总是一个坏主意(“代码味道”)。 原因有很多,最突出的是:
创建的名称可能很容易与您的逻辑已使用的变量发生冲突。
由于名称是动态创建的,您通常最终也会使用动态技术来检索数据。
这就是为什么 dicts 被包含在语言中的原因。 正确的操作方法是:
d = {}
for name in companies:
d[name] = pd.DataFrame()
现在你可以编写一个单独的dict 理解表达式来做同样的事情,但有些人发现它不太可读:
d = {name: pd.DataFrame() for name in companies}
创建d
,公司x
的DataFrame
可以检索为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))
添加到上述伟大的答案。 如果您需要创建空数据框,但如果您需要基于某些过滤创建多个数据框,则上述内容将完美无缺:
假设您得到的列表是某个数据框的列,并且您想为更大的数据框为每个独特的公司制作多个数据框:-
首先取公司的唯一名称:-
compuniquenames = df.company.unique()
创建一个数据框字典来存储你的数据框
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() 之间的区别请参考以下链接:
以下是可重现的 -> 假设您有一个包含 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.