pandas:dataframe中重复x列的两条条形图

bprjcwpo  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(410)

我有一个稍微奇怪的csv文件,其中月份列重复出现。我的目标是创建一个条形图,其中每个月有两列y(从a和b)。我试图通过将数据框分为两个部分来实现这一点——仅a和b——但月列的重复会造成阻碍。python和pandas还比较陌生,所以也许有一个函数我不知道?感谢您的帮助。

month   cond. y   

Jan     a     4    
Jan     b     8     
Feb     a     2     
Feb     b     9       
March   a     3   
March   b     7
lndjwyie

lndjwyie1#

我觉得这个问题一定有一个适用的副本,但我无法找到一个足够相关的副本来回答这个问题。
因此,解决这个问题最常用的方法可能是通过via将长格式数据重塑为宽格式数据 pivot 然后 DataFrame.plot :

import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame({
    'month': ['Jan', 'Jan', 'Feb', 'Feb', 'March', 'March'],
    'cond.': ['a', 'b', 'a', 'b', 'a', 'b'],
    'y': [4, 8, 2, 9, 3, 7]
})

df.pivot(index='month', columns='cond.', values='y').plot(kind='bar', rot=0)
plt.tight_layout()
plt.show()


有一个值得注意的问题是,x轴列的顺序不正确,因为它们是按字母顺序排列的,而不是按日期排序的。一种选择是 reindex 在策划之前。如果月份列是常规的,则会有更多选项,但由于它同时包含完整的月份名称和缩写,手动重新编制索引可能是最好的选项。

import pandas as pd
from matplotlib import pyplot as plt

df = pd.DataFrame({
    'month': ['Jan', 'Jan', 'Feb', 'Feb', 'March', 'March'],
    'cond.': ['a', 'b', 'a', 'b', 'a', 'b'],
    'y': [4, 8, 2, 9, 3, 7]
})

(
    df.pivot(index='month', columns='cond.', values='y')
        .reindex(['Jan', 'Feb', 'March'])  # Re-order so they appear correctly on x-axis
        .plot(kind='bar', rot=0)
)
plt.tight_layout()
plt.show()


seaborn在解决这类问题时非常受欢迎 hue 参数允许避免重塑步骤。另外 x 将按顺序出现在框架中,以便 reindex 也没有必要(假设数据在源 Dataframe 中以正确的顺序出现) sns.barplot :

import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt

sns.set_theme()  # (optional) Use seaborn theme
df = pd.DataFrame({
    'month': ['Jan', 'Jan', 'Feb', 'Feb', 'March', 'March'],
    'cond.': ['a', 'b', 'a', 'b', 'a', 'b'],
    'y': [4, 8, 2, 9, 3, 7]
})

sns.barplot(data=df, x='month', y='y', hue='cond.')
plt.tight_layout()
plt.show()

yhqotfr8

yhqotfr82#

使用“色调”属性进行分类也有效

import seaborn as sns
sns.barplot(data=df,x='Month',y='y',hue='Cond')

结果图

相关问题