pandas 在循环中创建多个 Dataframe

qlckcl4x  于 2023-05-21  发布在  其他
关注(0)|答案(6)|浏览(214)

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

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

我想为列表中的每个条目创建一个新的数据框。
就像
(伪代码)

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

我一直在寻找这样做的方法,但找不到。有什么想法吗

oug3syen

oug3syen1#

只是为了强调我对@maxymoo的回答的评论,动态地将名称添加到Python名称空间几乎总是一个坏主意(“code smell”)。原因有很多,最突出的是:
1.创建的名称可能很容易与逻辑已经使用的变量冲突。
1.由于名称是动态创建的,因此通常也会使用动态技术来检索数据。
这就是为什么字典被包括在语言中。正确的做法是:

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

现在,你可以写一个 dict comprehension 表达式来做同样的事情,但有些人觉得它可读性较差:

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():

因为这避免了示例化.items()在旧版本中创建的(name, df)元组的列表。这在很大程度上已经成为历史,尽管当然会有Python 2应用程序仍然存在,需要(希望偶尔)维护。

3xiyfsfu

3xiyfsfu2#

您可以这样做(尽管如果这是面向公共的代码,显然要非常小心地使用exec

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

am46iovg3#

加上上面的精彩回答。如果你需要创建空 Dataframe ,但如果你需要基于一些过滤来创建多个 Dataframe ,那么上面的操作将完美无瑕:
假设你得到的列表是一些数据框的一列,你想为每个独特的公司制作多个数据框,以形成更大的数据框:
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]

以上将为您提供一个数据框架,用于所有具有匹配记录的独特公司。

lnlaulya

lnlaulya4#

下面是在循环中动态创建 Dataframe 的代码:

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

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

关于vars()、locals()和globals()之间的区别,请参阅以下链接:
What's the difference between globals(), locals(), and vars()?

mjqavswn

mjqavswn5#

你可以这样做:

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

gudnpqoy6#

下面是可重现的->,所以假设你有一个包含df/公司名称的列表:

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"]来获取字典中的dataframe。但是如果你需要更“独特”的 Dataframe 命名,我认为你必须使用例如 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 ...

这是一个多一点的努力,但它允许你抓住 Dataframe 对象在一个更传统的方式,只需编写special_naming_1而不是dic['df_AA'],并给你更多的控制 Dataframe 的名称和列名,如果这是重要的。

相关问题