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 - gvkeyfyear 是什么?您可以添加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'])

根据不同级别做groupbys

一般来说,按照许多不同的方式对数据进行切片和切块。

您在问题中的建议使一维(原点)任意不同,很难想到这方面的优势。如果由于性能等原因需要沿某个维度进行拆分,您可以将 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

python python_dataframes_csv.py

Pyspark Dataframes:创建要在 python 中的聚类中使用的特征列