【问题标题】:Pandas: Storing Dataframe in Dataframe熊猫:在数据框中存储数据框
【发布时间】:2018-03-20 18:21:00
【问题描述】:

我对 Pandas 比较陌生,目前在尝试在 Dataframe 中插入 Dataframe 时遇到问题。

我想做什么: 我有多个模拟和相应的信号文件,我希望它们都在一个大 DataFrame 中。所以我想要一个 DataFrame,它包含我所有的模拟参数以及作为嵌套 DataFrame 的信号。它应该看起来像这样:

SimName | Date | Parameter 1 | Parameter 2 |  Signal 1 |  Signal 2 |
Name 1  | 123  | XYZ         | XYZ         | DataFrame | DataFrame |
Name 2  | 456  | XYZ         | XYZ         | DataFrame | DataFrame |

其中 SimName 是我的大数据帧索引,信号 1 和信号 2 中的每个条目都是一个单独的数据帧。

我的想法是这样实现:

big_DataFrame['Signal 1'].loc['Name 1']

但这会导致 ValueError:

索引器与 DataFrame 不兼容

是否可以在 Pandas 中使用这种嵌套的 DataFrame?

尼哥

【问题讨论】:

  • 你应该显示你的初始数据...
  • 初始数据是什么意思?现在我创建一个包含所有模拟列表作为索引的 DataFrame,然后一个接一个地添加每个模拟数据
  • 为什么要将 df 存储在 df 中?查看pandas panel

标签: python pandas indexing nested


【解决方案1】:

docs 表示只有Series 可以在DataFrame 内。但是,通过DataFrames 似乎也可以。这是一个假设没有列在MultiIndex 中的示例:

import pandas as pd

signal_df = pd.DataFrame({'X': [1,2,3],
                          'Y': [10,20,30]}  )

big_df = pd.DataFrame({'SimName': ['Name 1','Name 2'],
                       'Date ':[123  , 456 ],
                       'Parameter 1':['XYZ', 'XYZ'],
                       'Parameter 2':['XYZ', 'XYZ'],
                       'Signal 1':[signal_df, signal_df],
                       'Signal 2':[signal_df, signal_df]}  )

big_df.loc[0,'Signal 1']
big_df.loc[0,'Signal 1'][X]

这会导致:

out1:    X  Y
      0  1  10
      1  2  20
      2  3  30

out2: 0    1
      1    2
      2    3
      Name: X, dtype: int64

如果嵌套数据帧不能正常工作,您可以实现某种类型的指针,存储在big_df 中,允许您访问存储在别处的信号数据帧。

【讨论】:

    【解决方案2】:

    你应该使用 big_DataFrame['Signal 1'].loc['Name 1'] 而不是

    big_DataFrame.loc['Name 1','Signal 1']
    

    【讨论】:

    • 虽然这在语法上可能更简洁,但并不能避免问题。
    【解决方案3】:

    ns63sr's answer 末尾提到的“指针”可以实现为类,例如...

    定义:

    class df_holder:
        def __init__(self, df): 
            self.df = df
    

    设置:

    df.loc[0,'df_holder'] = df_holder(df)
    

    获取:

    df.loc[0].df_holder.df
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2017-06-14
      • 2017-01-21
      相关资源
      最近更新 更多