如何使用pandas绘制时间间隔直方图?
给定一个间隔数据帧(“开始时间”和“结束时间”),如何有效地生成直方图,显示每个时间点T中有多少间隔是“活动的” 生成示例数据帧的代码(抱歉,我相信有更好的方法): 一个例子: 对于以下数据帧:如何使用pandas绘制时间间隔直方图?,pandas,Pandas,给定一个间隔数据帧(“开始时间”和“结束时间”),如何有效地生成直方图,显示每个时间点T中有多少间隔是“活动的” 生成示例数据帧的代码(抱歉,我相信有更好的方法): 一个例子: 对于以下数据帧: import pandas as pd pd.DataFrame([{'start':2,'end':5},{'start':3,'end':8},{'start':9,'end':10},{'start':4,'end':5}]) 匹配图类似于: 我的直觉是,需要以某种方式将时间间隔分解为离散值,
import pandas as pd
pd.DataFrame([{'start':2,'end':5},{'start':3,'end':8},{'start':9,'end':10},{'start':4,'end':5}])
匹配图类似于:
我的直觉是,需要以某种方式将时间间隔分解为离散值,以便将它们组合起来,但是如何进行呢?您可以使用
apply
为每个范围生成值,然后melt
将数据重塑为长格式
In [113]: expanded = df.apply(lambda row: pd.Series(np.arange(row['start'], row['end'] + 1)), axis=1)
In [114]: expanded
Out[114]:
0 1 2 3 4 5
0 2 3 4 5 NaN NaN
1 3 4 5 6 7 8
2 9 10 NaN NaN NaN NaN
3 4 5 NaN NaN NaN NaN
In [115]: expanded = pd.melt(expanded)['value'].dropna()
In [116]: expanded
Out[116]:
0 2
1 3
2 9
3 4
4 3
5 4
6 10
7 5
8 4
9 5
12 5
13 6
17 7
21 8
Name: value, dtype: float64
从那里你可以使用内置的直方图,或者其他类型的分块
In [117]: expanded.hist()
 您可以使用
apply
为每个范围生成值,然后melt
将数据重塑为长格式
In [113]: expanded = df.apply(lambda row: pd.Series(np.arange(row['start'], row['end'] + 1)), axis=1)
In [114]: expanded
Out[114]:
0 1 2 3 4 5
0 2 3 4 5 NaN NaN
1 3 4 5 6 7 8
2 9 10 NaN NaN NaN NaN
3 4 5 NaN NaN NaN NaN
In [115]: expanded = pd.melt(expanded)['value'].dropna()
In [116]: expanded
Out[116]:
0 2
1 3
2 9
3 4
4 3
5 4
6 10
7 5
8 4
9 5
12 5
13 6
17 7
21 8
Name: value, dtype: float64
从那里你可以使用内置的直方图,或者其他类型的分块
In [117]: expanded.hist()
 chrisb的答案很好,但是5和6之间的差距是因为默认的垃圾箱数量是10。这意味着在您的情况下,箱子之间的距离为0.8,因此间距实际上在5.2和6之间 解决此问题的一种方法是手动设置与数据长度相等的存储箱数量:
nb_bins = int(max(expanded) - min(expanded))
expanded.hist(bins = nb_bins)
结果:
chrisb的答案很好,但5和6之间的差距是因为默认的垃圾箱数量默认为10。这意味着在您的情况下,箱子之间的距离为0.8,因此间距实际上在5.2和6之间 解决此问题的一种方法是手动设置与数据长度相等的存储箱数量:
nb_bins = int(max(expanded) - min(expanded))
expanded.hist(bins = nb_bins)
结果:
太棒了!非常感谢。试图找出是什么导致5-6之间的差距,因为他们都在名单上…太棒了!非常感谢。试图找出什么可能导致5-6之间的差距,因为他们都在名单上…请使用嵌入图像而不是链接这是我的意图,但似乎我没有足够的声誉这样做,这是我的第一个评论!)我们已经经历了这一过程,您必须等到您获得足够的声誉,会员可能会否决您的投票,这会使您失去分数,因此您必须从一个正确的答案开始,而不是评论请使用嵌入的图像而不是链接这是我的意图,但我似乎没有足够的声誉这样做,这是我的第一个评论!;)我们已经经历了这一切,你必须等到你获得足够的声誉,会员可能会否决你的投票,这会让你失去分数,所以你必须从一个正确的答案开始,而不是评论