Python中DataFrames的DataFrame(Pandas)
Posted
技术标签:
【中文标题】Python中DataFrames的DataFrame(Pandas)【英文标题】:DataFrame of DataFrames in Python (Pandas) 【发布时间】:2016-06-26 05:11:54 【问题描述】:这里的想法是,对于每一年,我都能够创建三个数据框(df1、df2、df3),每个包含不同的公司和股票价格('公司'和'价格'是 df1~df3 中的两列)。我想每年使用另一个数据框(下面称为“存储”)来存储三个数据框。
这是我的代码:
store = pd.DataFrame(list(range(1967,2014)), columns=['year'])
for year in range(1967,2014):
....some codes that allow me to generate df1, df2 and df3 correctly...
store.loc[store['year']==year, 'df1']=df1
store.loc[store['year']==year, 'df2']=df2
store.loc[store['year']==year, 'df3']=df3
在此代码之后,我没有收到错误警告或任何内容。 但在“存储”数据框中,“df1”、“df2”和“df3”列都是“NAN”值。
【问题讨论】:
什么是DataFrame
- gvkey
? fyear
是什么?您可以添加df1
的样本和store
的所需输出吗?
@jezrael,我更新了我的代码以使其更清晰。
仅基于代码,我认为您应该使用三个字典而不是一个数据框。我个人不会将数据帧存储在数据帧中。
【参考方案1】:
我认为 pandas 为您的建议提供了更好的选择(理由如下)。
首先,有 pandas.Panel
数据结构,它适用于您在这里所做的事情。
但是,正如 Wes McKinney(Pandas 的作者)在他的书 Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython 中指出的那样,多维索引在很大程度上提供了更好的选择。
考虑以下代码替代方案:
dfs = []
for year in range(1967,2014):
....some codes that allow me to generate df1, df2 and df3
df1['year'] = year
df1['origin'] = 'df1'
df2['year'] = year
df2['origin'] = 'df2'
df3['year'] = year
df3['origin'] = 'df3'
dfs.extend([df1, df2, df3])
df = pd.concat(dfs)
这将为您提供一个包含 4 列的 DataFrame:'firm'
、'price'
、'year'
和 'origin'
。
这使您可以灵活地:
按等级组织,例如'year'
和'origin'
:df.set_index(['year', 'origin'])
,例如'origin'
和'price'
:df.set_index(['origin', 'price'])
根据不同级别做groupby
s
一般来说,按照许多不同的方式对数据进行切片和切块。
您在问题中的建议使一维(原点)任意不同,很难想到这方面的优势。如果由于性能等原因需要沿某个维度进行拆分,您可以将 DataFrame 与标准 Python 数据结构更好地结合起来:
将每年映射到具有其他三个维度的 Dataframe 的字典。
三个 DataFrame,每个原点一个,每个具有三个维度。
【讨论】:
这很有帮助! 嗨@Ami,你能参考一下他们在书中讨论多维索引的地方吗?以上是关于Python中DataFrames的DataFrame(Pandas)的主要内容,如果未能解决你的问题,请参考以下文章
将 HDF 文件加载到 Python Dask DataFrames 列表中
python Spark Dataframes的备忘单(使用Python)
如何将Python Dask Dataframes合并到列中?
python python_dataframes_sql.py