多行数据的堆积图
Stacked plot of multirow data
我是 pandas 和 matplotlib 的新手,我不确定实现以下目标的正确方法是什么:
我有以下(示例)数据 so_df
:
输入:
import pandas as pd
so_df = pd.DataFrame({
"CATEGORY" : ["A", "B", "A", "B"],
"CONTEXT" : [ 1 , 1 , 0 , 0],
"COUNT" : [100, 111, 50 , 55]
})
so_df
输出:
CATEGORY CONTEXT COUNT
0 A 1 100
1 B 1 111
2 A 0 50
3 B 0 55
现在我想通过 CATEGORY
和 X="CONTEXT"
创建一个带有 y="COUNT"
的 stacked bar-plot。
我知道如何实现这一点的唯一方法是像这样切片和合并:
输入:
cat_a_df = so_df[so_df["CATEGORY"] == "A"] \
.rename(columns={"COUNT" : "COUNT A"}) \
.loc[:,["CONTEXT", "COUNT A"]]
cat_b_df = so_df[so_df["CATEGORY"] == "B"] \
.rename(columns={"COUNT" : "COUNT B"}) \
.loc[:,["CONTEXT", "COUNT B"]]
stacked_df = cat_a_df.merge(cat_b_df, on="CONTEXT")
stacked_df
输出:
CONTEXT COUNT A COUNT B
0 1 100 111
1 0 50 55
然后照常绘制新数据框:
stacked_df.plot(kind='bar', stacked=True, x="CONTEXT")
output
但是对于看似相当简单的任务,这似乎有点复杂。
有更好的方法吗?
您可以在一行中完成所有操作:
so_df.groupby(['CONTEXT', 'CATEGORY']).sum()['COUNT'].unstack().plot.bar(stacked=True)
我们按 'CONTEXT'
和 'CATEGORY
' 分组,然后应用 .sum()
从 groupby
对象到数据框 - 在您的情况下,总和不会'不要做任何事。最后我们 unstack
得到一列用于 A
和一列用于 B
。绘制这个给出:
我是 pandas 和 matplotlib 的新手,我不确定实现以下目标的正确方法是什么:
我有以下(示例)数据 so_df
:
输入:
import pandas as pd
so_df = pd.DataFrame({
"CATEGORY" : ["A", "B", "A", "B"],
"CONTEXT" : [ 1 , 1 , 0 , 0],
"COUNT" : [100, 111, 50 , 55]
})
so_df
输出:
CATEGORY CONTEXT COUNT
0 A 1 100
1 B 1 111
2 A 0 50
3 B 0 55
现在我想通过 CATEGORY
和 X="CONTEXT"
创建一个带有 y="COUNT"
的 stacked bar-plot。
我知道如何实现这一点的唯一方法是像这样切片和合并:
输入:
cat_a_df = so_df[so_df["CATEGORY"] == "A"] \
.rename(columns={"COUNT" : "COUNT A"}) \
.loc[:,["CONTEXT", "COUNT A"]]
cat_b_df = so_df[so_df["CATEGORY"] == "B"] \
.rename(columns={"COUNT" : "COUNT B"}) \
.loc[:,["CONTEXT", "COUNT B"]]
stacked_df = cat_a_df.merge(cat_b_df, on="CONTEXT")
stacked_df
输出:
CONTEXT COUNT A COUNT B
0 1 100 111
1 0 50 55
然后照常绘制新数据框:
stacked_df.plot(kind='bar', stacked=True, x="CONTEXT")
output
但是对于看似相当简单的任务,这似乎有点复杂。 有更好的方法吗?
您可以在一行中完成所有操作:
so_df.groupby(['CONTEXT', 'CATEGORY']).sum()['COUNT'].unstack().plot.bar(stacked=True)
我们按 'CONTEXT'
和 'CATEGORY
' 分组,然后应用 .sum()
从 groupby
对象到数据框 - 在您的情况下,总和不会'不要做任何事。最后我们 unstack
得到一列用于 A
和一列用于 B
。绘制这个给出: