【问题标题】:Storing 3-dimensional data in pandas DataFrame在 pandas DataFrame 中存储 3 维数据
【发布时间】:2022-03-26 14:59:56
【问题描述】:

我是 Python 新手,我正在尝试了解如何使用 pandas DataFrames 操作数据。我搜索了类似的问题,但我没有看到任何满足我的确切需求。如果这是重复的,请指出正确的帖子。

所以我有多个具有完全相同形状、列和索引的 DataFrame。如何将它们与标签结合起来,以便我可以轻松地使用任何列/索引/标签访问数据?

例如在下面的设置之后,如何将 df1 和 df2 放入一个 DataFrame 并用名称“df1”和“df2”标记它们,这样我就可以像 df['A']['df1'][ 'b'],获取df的行数?

>>> import numpy as np
>>> import pandas as pd
>>> df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'], index=['a', 'b'])
>>> df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['A', 'B'], index=['a', 'b'])
>>> df1
   A  B
a  1  2
b  3  4
>>> df2
   A  B
a  5  6
b  7  8

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为MultiIndex DataFrameconcat 创建的答案:

    df = pd.concat([df1, df2], keys=('df1','df2'))
    print (df)
           A  B
    df1 a  1  2
        b  3  4
    df2 a  5  6
        b  7  8
    

    那么对于基本选择可以使用xs:

    print (df.xs('df1'))
       A  B
    a  1  2
    b  3  4
    

    对于选择索引和列一起使用slicers

    idx = pd.IndexSlice
    print (df.loc[idx['df1', 'b'], 'A'])
    3
    

    另一种可能的解决方案是使用panels

    但在新版本的 pandas 中是deprecated

    【讨论】:

    • 非常感谢!是的,它看起来像 MultiIndex DataFrame 是我需要的。是否可以将 df['A'] 转换为以 ['a', 'b'] 为索引和 ['df1', 'df2'] 为列的 2D DataFrame?
    • 我觉得可以,只加axis=1 like df = pd.concat([df1, df2], keys=('df1','df2'), axis=1)
    • 然后通过idx = pd.IndexSliceprint (df.loc['b',idx['df1', 'A']])选择
    • df = pd.concat([df1, df2], keys=('df1','df2')).unstack(0) ?然后print (df.xs('A', axis=1))?
    • @jezrael 嗨 jezrael 我正在尝试通过循环连接许多 pd 来做同样的事情。我怎样才能正确连接键?我尝试制作一个逐渐附加的列表,但返回“无法连接不具有相同级别数的索引”(这实际上是有道理的......)
    【解决方案2】:

    建议使用xarray,因为other answers to 有类似问题的建议。由于 pandas 面板已被弃用,取而代之的是 xarray。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 2017-01-09
      • 2016-01-14
      • 1970-01-01
      • 2016-12-07
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多