重新排列熊猫数据框以分组条形图

时间:2018-10-05 14:20:47

标签: python pandas dataframe

我有一个大致如下的熊猫数据框:

df = pd.DataFrame(data, columns=["property_1", "property_2", "value"], index=my_index)

my_index    property_1    property_2    value
<1, 1, 1>   "A"           "X"           ...
<1, 1, 1>   "A"           "Y"           ...
<1, 1, 2>   "A"           "X"           ...
<1, 1, 4>   "A"           "X"           ...
<1, 1, 4>   "A"           "Y"           ...
<1, 1, 4>   "B"           "X"           ...
<1, 1, 4>   "B"           "Y"           ...

我想生成一个如下的分组条形图:

desired group bar chart

这很复杂,但是基本上是:

  1. 我需要将my_index减少为唯一索引,这些唯一索引对于property_1property_2的每种组合都有一个值
  2. 我需要找到property_1 AND property_2唯一组合,而不仅仅是每个列的唯一值!
  3. 我正在尝试主要按my_index分组,然后按property_1property_2的组合分组

我猜想,要解决此问题的方法是通过使用具有以下布局的数据框:

my_index    A-X    A-Y    B-X    B-Y    ... 
<1, 1, 1>   ...    ...    NaN    NaN    ...
<1, 1, 2>   ...    ...    NaN    NaN    ...

以此类推。然后,可以删除其中包含任何NaN值的列。然后,您可以仅在该结果数据帧上调用df.plot.bar(...)

但是我不确定如何以这种方式将这些行重新排列为列。有人有什么想法吗?

编辑:我应该注意,我不需要用熊猫回答,我只是问是否有答案。如果没有,我可以自己整理数据。但是,也许熊猫具有使这种工作变得更轻松的妙趣横生。

1 个答案:

答案 0 :(得分:0)

我可能错误地理解了您的问题。但是,让我提出一些可能对您有所帮助的步骤。

首先,从列unique_propertyproperty_1中添加一列property_2,然后(如果需要)删除后面的两列。

df[`unique_property`] = df.property_1 + df.property_2
df.drop(['property_1', 'property_2'], axis=1, inplace=True)

然后,我们可以绘制按my_indexunique_property分组的数据框。

fig, ax = plt.subplots()
ax.set_xticks(df['my_index'].unique()) # this sets x axis.
df.groupby(["my_index", "unique_property"]).mean()['value'].unstack().plot(kind='bar', ax=ax)

最后一行的说明。

df.groupby(["my_index", "unique_property"]).mean()['value']

以上代码将为我们提供value的系列,按my_indexunique_property分组。如果直接绘制它,则将获得(my_indexunique_property)中唯一值的所有组合作为x轴。这就是为什么我们需要

unstack()

就像my_index中的唯一值变成行而unique_property中的唯一值变成列一样。

默认情况下,它将为不完整的数据生成NaN值,例如对于my_index = <1,1,1>,只有AXAY才有值,然后BXBY将由NaN值填充。例如,我们可以将NaN替换为some_value,然后替换unstack(fill_value=some_value)