我有以下问题:
鉴于pandas数据框有许多独特的主机名,我想绘制一个水平条形图,表明该主机名发生特定问题的时间长度。
我有以下代码:
# Create a bar plot for each unique system name of all ticket entries
for sys_name in unique_sys_names:
# Grab the df that refers to just the issues with that system name
j_data_sys = eff_j_data[eff_j_data['System Name'] == sys_name]
eff_j_data_sys = j_data_sys[['Created','Resolved','Summary']]
eff_j_data_sys.plot.barh(x=eff_j_data_sys['Resolved']-eff_j_data_sys['Created'],y=range(0,len(eff_j_data_sys)))
基本上,我在一个更大的pandas数据帧中有唯一的主机名,每个都有一个从1到N的问题。在for循环中,我只是遍历唯一的主机名(sys_name
),然后我抓住了所有的与j_data_sys
中的主机名相关的问题。然后我抓住每个问题的创建和解决的所有时间以及问题摘要。我想做的只是如下图所示:Example Bar Plot
当然,这可能包括N个问题,每个问题都有相应的开始和结束时间戳。
包含此数据的示例数据框将是:
Created Resolved Summary
9 2016-04-25 10:29:00 2016-04-26 13:22:00 1 Blade Missing
10 2016-04-25 10:10:00 2016-04-25 10:23:00 Blade in Lockdown
建议以适当的方式最佳地表示此数据的任何其他建议。
谢谢,
答案 0 :(得分:0)
我认为您不需要条形图,因为它用于可视化分类数据的相对分布。一种解决方案可以使用以下方法。让我们假设我们以csv格式提供测试数据。
In [1]: import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("df.txt", parse_dates = ["Created", "Resolved"], index_col = "Summary")
df = df.stack().reset_index().rename(columns={0:"date"}).set_index("date")[["Summary"]]
df = pd.get_dummies(df).applymap(lambda x:x if x else pd.np.nan)
for n, col in enumerate(df.columns): df[col] = df[col]*n
df.plot(lw=10, legend=False)
plt.yticks(pd.np.arange(len(df.columns)), df.columns)
plt.tight_layout()
plt.show()
基本上,上面的代码是转换" Created和Resolved"新数据帧的索引中的列,然后在发生时为每个事件分配数值,如果不是则为NaN。结果数据框是:
In [2]: df
Out[2]:
Summary_1 Blade Missing Summary_Blade in Lockdown
date
2016-04-25 10:29:00 0.0 NaN
2016-04-26 13:22:00 0.0 NaN
2016-04-25 10:10:00 NaN 1.0
2016-04-25 10:23:00 NaN 1.0
结果图:
我希望这可以帮到你。 问候。