【问题标题】:Pandas Multicolumn Groupby PlottingPandas 多列 Groupby 绘图
【发布时间】:2017-01-28 14:18:31
【问题描述】:

问题:
我有一个熊猫数据框,我想按年月和规则名称进行分组。分组后,我希望能够获得该期间每个规则的计数以及该组所有规则的百分比。到目前为止,我能够获得每个时期的计数,但不能获得百分比。

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

目标数据框:
对于 rule_name A:

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:

# 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:

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

【问题讨论】:

    标签: python pandas plot group-by filtering


    【解决方案1】:

    我能够解决这个问题。以下代码提供了必要的绘图和数据处理。我把它放出来以防万一这对其他人有帮助。感觉有点笨拙,但它成功了。任何改进这一点的建议将不胜感激。

    谢谢。

    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
    

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2019-02-13
      • 1970-01-01
      • 2021-09-11
      • 2017-03-07
      • 2021-04-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      相关资源
      最近更新 更多