python,在数据帧中存储字典

时间:2013-05-12 18:05:04

标签: python dictionary dataframe pandas

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

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

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

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

但现在我想在columnA中绘制字典中所有收入值的图表 - 达到此目的的最佳方法是什么?

如果我放弃字典并使用两个大小相同的数据帧,从长远来看生活会更容易吗? (对熊猫来说很新,所以不确定最佳做法)。

2 个答案:

答案 0 :(得分:8)

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

根据你正在做的事情,如果你稍微调整你的结构,生活可能会更容易。例如,您可以使用带有“Sales”和“Revenue”的分层索引作为一个级别的键。

答案 1 :(得分:3)

对于大多数用例,在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}

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

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眩晕:

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

还有("experimental") higher dimensional Panels