我有一个大致如下的熊猫数据框:
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" ...
我想生成一个如下的分组条形图:
这很复杂,但是基本上是:
my_index
减少为唯一索引,这些唯一索引对于property_1
和property_2
的每种组合都有一个值property_1
AND property_2
的唯一组合,而不仅仅是每个列的唯一值!my_index
分组,然后按property_1
和property_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(...)
。
但是我不确定如何以这种方式将这些行重新排列为列。有人有什么想法吗?
编辑:我应该注意,我不需要用熊猫回答,我只是问是否有答案。如果没有,我可以自己整理数据。但是,也许熊猫具有使这种工作变得更轻松的妙趣横生。
答案 0 :(得分:0)
我可能错误地理解了您的问题。但是,让我提出一些可能对您有所帮助的步骤。
首先,从列unique_property
和property_1
中添加一列property_2
,然后(如果需要)删除后面的两列。
df[`unique_property`] = df.property_1 + df.property_2
df.drop(['property_1', 'property_2'], axis=1, inplace=True)
然后,我们可以绘制按my_index
和unique_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_index
和unique_property
分组。如果直接绘制它,则将获得(my_index
,unique_property
)中唯一值的所有组合作为x轴。这就是为什么我们需要
unstack()
。
就像my_index
中的唯一值变成行而unique_property
中的唯一值变成列一样。
默认情况下,它将为不完整的数据生成NaN
值,例如对于my_index = <1,1,1>
,只有AX
和AY
才有值,然后BX
和BY
将由NaN
值填充。例如,我们可以将NaN
替换为some_value
,然后替换unstack(fill_value=some_value)
。