【问题标题】:Is it possible to create dataframe with sub-headers in Pandas?是否可以在 Pandas 中创建带有子标题的数据框?
【发布时间】:2017-07-07 14:18:22
【问题描述】:

我有以下代码:

_tmp = {}
_tmp['pre'] = {
    'A2': 10,
    'B2': 15,
    'C2': 20
}
_tmp['diff'] = {
    'A1': 10,
    'B1': 15,
    'C1': 20
}
_tmp['sum'] = {
    'A': 100,
    'B': 150,
    'C': 200
}

通过执行以下命令:

_dff = pd.DataFrame(data=_tmp.values(), index=_tmp.keys())
_dff[['A', 'B', 'C', 'A1', 'B1', 'C1', 'A2', 'B2', 'C2']]

我得到了如下描述的结果:

但是我很想知道是否可以在 pandas 中构建如下结构:

【问题讨论】:

  • 您需要标题A1B1 等吗?
  • 是的,我需要 3 级标题:A、B、C 下一个 A1、B1、C1 下一个 A2、B2、C2。谢谢
  • pandas 不这样做......你希望用这个来完成什么?您可以只使用 3 个单独的数据框并背靠背打印它们。 pandas 用于网格类型的数据,而您的模型不是网格。
  • 请注意,您可以执行多级索引 - 根据您要执行的操作,它可能会让您更接近您想要的,但它仍然不会看起来像那个。
  • 我预计 pandas 做不到 :)。但是,有一个非常好的功能 - 计算每个子标题等的 Pandas 总数

标签: python python-2.7 pandas dataframe


【解决方案1】:

您真正看到的是一个三维结构,这是数据框无法做到的。 (它们只是 2D 的。)

这给你留下了几个选择:

(1) 多个数据帧(pre/diff/sum)。

dfs = {k:pd.DataFrame(v.items()) for k,v in _tmp.items()}

(2) 一个 pandas Panel,您可以像这样构建它:

pnl = pd.Panel(dfs)

这是对多个数据帧进行分组的一种方式。

(3) 一个 3d numpy 矩阵:

>>> pnl.as_matrix()
[[['A1' 10]
  ['C1' 20]
  ['B1' 15]]

 [['C2' 20]
  ['A2' 10]
  ['B2' 15]]

 [['A' 100]
  ['C' 200]
  ['B' 150]]]

当然,您将不得不编写一个自定义打印函数来获得您请求的确切输出,但这些将是您可以表示数据的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2020-12-30
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多