Python 熊猫多列群作图法
问题:Python 熊猫多列群作图法,python,pandas,plot,group-by,filtering,Python,Pandas,Plot,Group By,Filtering,问题: 我有一个pandas数据框架,我想按年份、月份和规则名称进行分组。一旦按分组,我希望能够获得该期间每个规则的计数以及该组所有规则的百分比。到目前为止,我能够得到每个周期的计数,但不能得到百分比 目标是有一个类似于底部的图,但在右y轴上,我也会有时间段的百分比 目标数据帧: 对于规则名称A: date counts (rule_name) %_rule_name Jan 16 1 50 Feb 16 0
我有一个pandas数据框架,我想按年份、月份和规则名称进行分组。一旦按分组,我希望能够获得该期间每个规则的计数以及该组所有规则的百分比。到目前为止,我能够得到每个周期的计数,但不能得到百分比 目标是有一个类似于底部的图,但在右y轴上,我也会有时间段的百分比 目标数据帧:
对于规则名称A:
date counts (rule_name) %_rule_name
Jan 16 1 50
Feb 16 0 0
Jun 16 2 66
我希望对每个规则名称(即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:
我觉得有更好的方法可以做到这一点,但我无法找到它。我在这个问题上绞尽脑汁已经有一天了。我应该过滤吗?我尝试使用多索引组,但无法创建%\u rule\u 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
我能够解决这个问题。以下代码提供了必要的绘图和数据处理。我把它挂起来以防这对其他人有帮助。这感觉有点刺耳,但它成功了。如有任何改进建议,将不胜感激 非常感谢
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