大熊猫多列组通过绘图

大熊猫多列组通过绘图

问题描述:

问题:
我有一个熊猫数据框,我想按照year-months和rule_name进行分组。一旦分组,我希望能够获得在该期间每个规则的计数以及该组所有规则的百分比。到目前为止,我能够得到每个时期的数量,但不是百分比。大熊猫多列组通过绘图

目标是要有一个类似于底部的情节的图,但在右侧的y轴上我也有时间段的百分比。

目标Dataframes:
对于RULE_NAME答:

date  counts (rule_name) %_rule_name 
Jan 16  1     50 
Feb 16  0     0 
Jun 16  2     66 

我想继续这样每个RULE_NAME(即,B和C)

到目前为止的代码:

d = {'date': ['1/1/2016', '2/1/2016', '3/5/2016', '2/5/2016', '1/15/2016', '3/3/2016', '3/4/2016'], 
'rule_name' : ['A' , 'B', 'C', 'C', 'B', 'A','A']} 

df = pd.DataFrame(d) 

Output: 

enter image description here

# format string date to datetime 
df['date'] = pd.to_datetime(df['date'], format='%m/%d/%Y', errors='coerce') 


rule_names = df['rule_name'].unique().tolist() 
for i in rule_names: 
    print "" 
    print 'dataframe for', i ,':' 
    df_temp = df[df['rule_name'] == i] 
    df_temp = df_temp.groupby(df_temp['date'].map(lambda x: str(x.year) + '-' + str(x.strftime('%m')))).count() 
    df_temp.plot(kind='line', title = 'Rule Name: ' + str(i)) 
    print df_temp 

Output: 

enter image description here

enter image description here

我觉得有一个更好的办法来做到这一点,但我无法弄清楚。在最后一天,我一直在为这个问题绞尽脑汁。我应该过滤吗?我尝试了多索引组,但无法创建%_rule_name列。感谢您提前输入。

我能解决这个问题。以下代码提供了必要的图表和数据处理。我正在推出以防别人帮助别人。它感觉有点疯狂,但它可以完成。任何建议,以改善这将不胜感激。

谢谢。

import seaborn as sns 

df_all = df.groupby(df['date'].map(lambda x: str(x.year) + '-' + str(x.strftime('%m')))).count() 
df_all = pd.DataFrame(df_all) 
df_all['rule_name_all_count'] = df_all['rule_name'] 

rule_names = df['rule_name'].unique().tolist() 
for i in rule_names: 
    print "" 
    print 'dataframe for', i ,':' 
    df_temp = df[df['rule_name'] == i] 
    df_temp = df_temp.groupby(df_temp['date'].map(lambda x: str(x.year) + '-' + str(x.strftime('%m')))).count() 
    df_temp = pd.DataFrame(df_temp) 
    df_merge = pd.merge(df_all, df_temp, right_index = True, left_index = True, how='left') 
    drop_x(df_merge) 
    rename_y(df_merge) 
    df_merge.drop('date', axis=1, inplace=True) 
    df_merge['rule_name_%'] = df_merge['rule_name'].astype(float)/df_merge['rule_name_all_count'].astype(float) 
    df_merge = df_merge.fillna(0) 

    fig = plt.figure() 
    ax = fig.add_subplot(111) 
    ax2 = ax.twinx() 

    df_merge['rule_name'].plot() 
    df_merge['rule_name_%'].plot() 
    plt.show() 
    print df_temp 

enter image description here

enter image description here