使用seaborn的多索引Pandas数据帧和条形图

2024-05-13 01:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

拥有这个数据帧

Risk scoring Sam   1/1  1/2   2/2  3/1  3/2  4/1
Date                                            
August             NaN  1.0   NaN  NaN  NaN  NaN
December           6.0  3.0   4.0  2.0  4.0  NaN
January            2.0  NaN   2.0  1.0  2.0  NaN
November           2.0  1.0  12.0  3.0  4.0  1.0
October           14.0  4.0  12.0  4.0  4.0  NaN
September         21.0  3.0   7.0  3.0  2.0  NaN

我正在画这张图

df2020_2.plot(kind='bar')

enter image description here

除了seaborn,我怎么能做同样的情节


Tags: 数据dateplotsamnanriskscoringkind
1条回答
网友
1楼 · 发布于 2024-05-13 01:24:26

您需要第一个melt数据帧,如下所示:

import pandas as pd
df = pd.DataFrame({
    'Date': ['August', 'December', 'January', 'November'],
    '1/1': [float('nan'), 6.0, 2.0, 2.0],
    '1/2': [1.3,3.0,float('nan'),1.0],
    '2/2': [float('nan'),4.0,2.0,12.0]
})

print(df)

melt_df = pd.melt(df, id_vars="Date", var_name="par", value_name="rate")
print(melt_df)

输出:

       Date  1/1  1/2   2/2
0    August  NaN  1.3   NaN
1  December  6.0  3.0   4.0
2   January  2.0  NaN   2.0
3  November  2.0  1.0  12.0


        Date  par  rate
0     August  1/1   NaN
1   December  1/1   6.0
2    January  1/1   2.0
3   November  1/1   2.0
4     August  1/2   1.3
5   December  1/2   3.0
6    January  1/2   NaN
7   November  1/2   1.0
8     August  2/2   NaN
9   December  2/2   4.0
10   January  2/2   2.0
11  November  2/2  12.0

然后用sns.factorplot()绘制条形图,如下所示:

import seaborn as sns
sns.factorplot(x='Date', y='rate', hue='par', data=melt_df, kind='bar')

输出:

enter image description here

根据您的评论进行编辑:如果您的号码是字符串,则需要将其转换为以下格式:

df = pd.DataFrame({
    'Date': ['August', 'December', 'January', 'November'],
    '1/1': ['', '6.0', '2.0', '2.0'],
    '1/2': ['1.3','3.0','','1.0'],
    '2/2': ['','4.0','2.0','12.0']
})


df[["1/1", "1/2", "2/2"]] = df[["1/1", "1/2", "2/2"]].apply(pd.to_numeric)

根据您的评论进行编辑,并为Multi-Index DataFrame:

为此,你可以先pivot_table然后melt最后用sns.factorplot绘制你的欲望图

import pandas as pd
import seaborn as sns

df = pd.DataFrame({
    'Date': ['August', 'August', 'August', 'August', 'August', 'August', 'December', 'December', 'December', 'December', 'December', 'December','January', 'January', 'January', 'January' , 'January' , 'January', 'November', 'November', 'November', 'November', 'November', 'November', 'October', 'October', 'October', 'October','October', 'October', 'September', 'September', 'September', 'September', 'September', 'September'],
    'Risk scoring Sam': ['1/1', '1/2','2/2', '3/1','3/2', '4/1', '1/1', '1/2','2/2', '3/1','3/2', '4/1','1/1', '1/2','2/2', '3/1','3/2', '4/1','1/1', '1/2','2/2', '3/1','3/2', '4/1','1/1', '1/2','2/2', '3/1','3/2', '4/1','1/1', '1/2','2/2', '3/1','3/2', '4/1'],
    'Number': [float('nan'),1,float('nan'),float('nan'),float('nan'), float('nan'),6,3,4,2,4,float('nan'),2,float('nan'),2,1,2,float('nan'),2,1,12,3,4,1,14,4,12,4,4,float('nan'),21,3,7,3,2,float('nan')]})

# if Your df['Number'] is String and you want convert to float use this
# df['Number'] =df['Number'].apply(pd.to_numeric)

df2 = df.pivot_table(index='Date', columns='Risk scoring Sam', values='Number')

df3 = pd.melt(df2.reset_index(), id_vars='Date')

sns.factorplot(x='Date', y='value', hue='Risk scoring Sam', data=df3, kind='bar')

输出:

enter image description here

相关问题 更多 >