我有一个列表,每个条目都是一个公司名称
companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想为列表中的每个条目创建一个新的数据框。就像(伪代码)
for c in companies: c = pd.DataFrame()
我一直在寻找这样做的方法,但找不到。有什么想法吗
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,公司x的DataFrame就可以作为d[x]检索,因此您可以很容易地查找特定的公司。要对所有公司进行操作,您通常会使用以下循环:
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():
因为这避免了示例化.items()在旧版本中创建的(name, df)元组的列表。这在很大程度上已经成为历史,尽管当然会有Python 2应用程序仍然存在,需要(希望偶尔)维护。
.items()
(name, df)
3xiyfsfu2#
您可以这样做(尽管如果这是面向公共的代码,显然要非常小心地使用exec)
exec
for c in companies: exec('{} = pd.DataFrame()'.format(c))
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]
以上将为您提供一个数据框架,用于所有具有匹配记录的独特公司。
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()?
mjqavswn5#
你可以这样做:
for xxx in yyy: globals()[f'dataframe_{xxx}'] = pd.Dataframe(xxx)
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["df_AA"]
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 的名称和列名,如果这是重要的。
special_naming_1
dic['df_AA']
6条答案
按热度按时间oug3syen1#
只是为了强调我对@maxymoo的回答的评论,动态地将名称添加到Python名称空间几乎总是一个坏主意(“code smell”)。原因有很多,最突出的是:
1.创建的名称可能很容易与逻辑已经使用的变量冲突。
1.由于名称是动态创建的,因此通常也会使用动态技术来检索数据。
这就是为什么字典被包括在语言中。正确的做法是:
现在,你可以写一个 dict comprehension 表达式来做同样的事情,但有些人觉得它可读性较差:
一旦创建了
d
,公司x
的DataFrame
就可以作为d[x]
检索,因此您可以很容易地查找特定的公司。要对所有公司进行操作,您通常会使用以下循环:在Python 2中,你可以更好地编写
因为这避免了示例化
.items()
在旧版本中创建的(name, df)
元组的列表。这在很大程度上已经成为历史,尽管当然会有Python 2应用程序仍然存在,需要(希望偶尔)维护。3xiyfsfu2#
您可以这样做(尽管如果这是面向公共的代码,显然要非常小心地使用
exec
)am46iovg3#
加上上面的精彩回答。如果你需要创建空 Dataframe ,但如果你需要基于一些过滤来创建多个 Dataframe ,那么上面的操作将完美无瑕:
假设你得到的列表是一些数据框的一列,你想为每个独特的公司制作多个数据框,以形成更大的数据框:
1.首先是公司的名称:
1.创建数据框字典以存储数据框
以上两个已经在帖子里了:
以上将为您提供一个数据框架,用于所有具有匹配记录的独特公司。
lnlaulya4#
下面是在循环中动态创建 Dataframe 的代码:
关于vars()、locals()和globals()之间的区别,请参阅以下链接:
What's the difference between globals(), locals(), and vars()?
mjqavswn5#
你可以这样做:
gudnpqoy6#
下面是可重现的->,所以假设你有一个包含df/公司名称的列表:
你可能也有数据,大概也有一个列表?(或者更确切地说是列表的列表),例如:
在这个特殊的例子中,df可能看起来非常相似,所以这并不需要非常复杂:
在这里,您必须使用
dic["df_AA"]
来获取字典中的dataframe。但是如果你需要更“独特”的 Dataframe 命名,我认为你必须使用例如 if-conditions,比如:这是一个多一点的努力,但它允许你抓住 Dataframe 对象在一个更传统的方式,只需编写
special_naming_1
而不是dic['df_AA']
,并给你更多的控制 Dataframe 的名称和列名,如果这是重要的。