【问题标题】:python, storing dictionaries inside a dataframepython,将字典存储在数据框中
【发布时间】:2013-05-06 19:18:37
【问题描述】:

我已经构建了一个 pandas 数据框,它在每个单元格中存储了一个简单的字典。例如:

{'Sales':0,'Revenue':0}

我可以通过以下方式从数据框中检索特定值:

df[columnA][index100]['Revenue']

但现在我想从columnA 中的字典中绘制所有收入值的图表 - 实现这一目标的最佳方法是什么?

如果我放弃字典并使用两个相同大小的数据框,从长远来看,生活会更轻松吗? (我对 pandas 很陌生,所以不确定最佳实践)。

【问题讨论】:

  • 更新:最后我选择了一个分层索引,它继续完美运行 - 感谢您的帮助。

标签: python dictionary dataframe pandas


【解决方案1】:

从 A 列获取所有收入值的简单方法是 df[columnA].map(lambda v: v['Revenue'])

根据您所做的工作,如果您稍微调整一下结构,生活可能确实会更轻松。例如,您可以使用以“Sales”和“Revenue”作为一级键的分层索引。

【讨论】:

  • 谢谢你 - 有很大帮助
【解决方案2】:

对于大多数用例,将字典存储在 DataFrame 中并不是一个好主意。
另一个值得一提的数据结构是Panel

假设你有一些字典的 DataFrame(具有相当一致的键):

In [11]: df = pd.DataFrame([[{'a': 1, 'b': 2}, {'a': 3, 'b': 4}], [{'a': 5, 'b': 6}, {'a': 7, 'b': 8}]], columns=list('AB'))

In [12]: df
Out[12]:
                  A                 B
0  {'a': 1, 'b': 2}  {'a': 3, 'b': 4}
1  {'a': 5, 'b': 6}  {'a': 7, 'b': 8}

您可以创建一个面板(注意有更直接/更可取的方法来构建它!):

In [13]: wp = pd.Panel({'A': df['A'].apply(pd.Series), 'B': df['B'].apply(pd.Series)})

In [14]: wp
Out[14]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: A to B
Major_axis axis: 0 to 1
Minor_axis axis: a to b

可以通过多种方式作为 DataFrame 有效访问其中的部分,例如:

In [15]: wp.A
Out[15]:
   a  b
0  1  2
1  5  6

In [16]: wp.minor_xs('a')
Out[16]:
   A  B
0  1  3
1  5  7

In [17]: wp.major_xs(0)
Out[17]:
   A  B
a  1  3
b  2  4

所以你可以做所有的 pandas DataFrame whizziness:

In [18]: wp.A.plot()  # easy!
Out[18]: <matplotlib.axes.AxesSubplot at 0x1048342d0>

还有("experimental") higher dimensional Panels

【讨论】:

  • 我很想看看 N-D 实验的结果。我们有自己开发的 n-dim 对象,用于数据处理,具有不同类型的轴,我经常在平面数据帧和超立方体之间移动。
  • 谢谢 - 我会尝试这个以及@BrenBarn 之前提到的分层索引
  • @Sylvansight 可能值得注意的是,您可以通过 to_panel 方法从分层索引 DataFrame 移动到面板:)
  • @DSM n-d 工厂和对象非常实用(experimental 是 0.9 的标签)。任何愿望清单请打开一个问题。
  • 从 Pandas 0.20.0 开始,面板已被弃用,并且根据 Panda 的文档建议,要走的路是使用分层索引或转换到 xarray,如讨论 here
猜你喜欢
  • 2011-02-22
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多