companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想为列表中的每个条目创建一个新的数据框。
就像这样
(伪代码)
for c in companies:
c = pd.DataFrame()
我已经搜索了一种方法来做这件事,但找不到。有什么想法吗?
companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想为列表中的每个条目创建一个新的数据框。
就像这样
(伪代码)
for c in companies:
c = pd.DataFrame()
我已经搜索了一种方法来做这件事,但找不到。有什么想法吗?
强调一下我对@maxymoo答案的评论,动态地向Python命名空间添加名称几乎总是一个坏主意(“code smell”)。原因有很多,其中最重要的是:
创建的名称可能会与逻辑中已经使用的变量发生冲突。
由于名称是动态创建的,您通常也会使用动态技术来检索数据。
这就是为什么字典被包含在语言中的原因。正确的做法是:
d = {}
for name in companies:
d[name] = pd.DataFrame()
d = {name: pd.DataFrame() for name in companies}
一旦创建了d
,就可以通过d[x]
检索公司x
的DataFrame
,因此您可以轻松查找特定公司。要对所有公司进行操作,通常会使用类似以下循环:
for name, df in d.items():
# operate on DataFrame 'df' for company 'name'
for name, df in d.iteritems():
(name, df)
元组列表的.items()
创建。
尽管现在这主要是历史性的兴趣,但仍然会有一些Python 2应用程序存在并需要(希望偶尔的)维护。exec
,但从更大的方面来看,这只是小问题 - 虽然感谢您说这个更好。对我而言,Stackoverflow不是竞争,而是提供信息的一种可见需求方式。 - holdenweb你可以这样做(尽管显然需要极度谨慎地使用 exec
,如果这将是公开的面向代码)
for c in companies:
exec('{} = pd.DataFrame()'.format(c))
format(c.replace('.',''))
来解决此问题。 - maxymood
,并编写d[c] = pd.DataFrame()
。例如,阅读这个答案,以开始理解为什么这是一个不好的想法。 - holdenwebcompanies = ['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()?
除了以上优秀的答案外,如果您需要创建空数据帧,则以上内容将无缝运行,但是如果您需要基于某些过滤条件创建多个数据帧:
假设您得到的列表是某个数据帧的一列,并且您想为较大数据帧中的每个唯一公司创建多个数据帧:
First take the unique names of the companies:-
compuniquenames = df.company.unique()
Create a data frame dictionary to store your data frames
companydict = {elem : pd.DataFrame() for elem in compuniquenames}
for key in DataFrameDict.keys():
DataFrameDict[key] = df[:][df.company == key]
for key in companydict.keys():
companydict[key] = df[:][df.company == key]
但无论如何,我并没有看到这个代码的确切输出。 - pink.slash以下是您可以采用的方法:
for xxx in yyy:
globals()[f'dataframe_{xxx}'] = pd.Dataframe(xxx)
companies = ['AA', 'AAPL', 'BA', 'YHOO']
你可能也有数据,大概也是一个列表?(或者更确切地说是列表的列表)像这样:
content_of_lists = [
[['a', '1'], ['b', '2']],
[['c', '3'], ['d', '4']],
[['e', '5'], ['f', '6']],
[['g', '7'], ['h', '8']]
]
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-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']
,并且如果数据框名称和列名很重要,它还可以让你更好地控制。