2016-09-20 72 views
1

問題:
私は年月とrule_nameでグループ化したいデータのパンダデータフレームを持っています。一度グループ化すると、その期間の各ルールの数とそのグループのすべてのルールの割合を取得できます。これまでのところ、私は各期間をカウントすることができますが、パーセンテージは取得できません。パンダ複数列Groupbyプロット

目標は下のものと同様のプロットを持つことですが、右のy軸には期間のパーセンテージもあります。

目標のデータフレーム:RULE_NAMEのAの場合
:私は(BとCのためにすなわち)各RULE_NAMEのためにこれを続けていきたいと考えて

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

コードこれまで:

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列を作成できませんでした。入力いただきありがとうございます。

答えて

0

これを解決できました。次のコードは、必要なプロットとデータ処理を提供します。これが他の誰かを助ける場合に備えて私はそれを置いています。それはジャッキーのような感じですが、それはトリックを完了します。これを改善するための提案は感謝します。 SO

感謝。

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