我经常使用具有非常“长尾”的数据。我想绘制直方图来总结分布,但当我尝试使用熊猫时,我得到了一个条形图,其中有一个巨大的可见条形图,其他所有内容都不可见。
以下是我正在使用的系列的一个示例。因为它很长,所以我使用了value_counts(),所以它可以放在这个页面上。
In [10]: data.value_counts.sort_index()
Out[10]:
0 8012
25 3710
100 10794
200 11718
300 2489
500 7631
600 34
700 115
1000 3099
1200 1766
1600 63
2000 1538
2200 41
2500 208
2700 2138
5000 515
5500 201
8800 10
10000 10
10900 465
13000 9
16200 74
20000 518
21500 65
27000 64
53000 82
56000 1
106000 35
530000 3
我猜答案包括以某种方式将不太常见的结果分成更大的组(53000、56000、106000和53000分成>50000的一组,等等),并改变y指数来表示出现的百分比,而不是绝对数字。然而,我不明白我如何自动地去做这件事。
发布于 2014-08-15 14:12:44
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
mydict = {0: 8012,25: 3710,100: 10794,200: 11718,300: 2489,500: 7631,600: 34,700: 115,1000: 3099,1200: 1766,1600: 63,2000: 1538,2200: 41,2500: 208,2700: 2138,5000: 515,5500: 201,8800: 10,10000: 10,10900: 465,13000: 9,16200: 74,20000: 518,21500: 65,27000: 64,53000: 82,56000: 1,106000: 35,530000: 3}
mylist = []
for key in mydict:
for e in range(mydict[key]):
mylist.insert(0,key)
df = pd.DataFrame(mylist,columns=['value'])
df2 = df[df.value <= 5000]
以条形图形式绘制:
fig = df.value.value_counts().sort_index().plot(kind="bar")
plt.savefig("figure.png")
作为一个直方图(限定值为5000 &低于这个值,数据的97%以上):我喜欢使用linspace来控制存储桶。
df2 = df[df.value <= 5000]
df2.hist(bins=np.linspace(0,5000,101))
plt.savefig('hist1')
编辑:将np.linspace(0,5000,100)
更改为np.linspace(0,5000,101)
并更新直方图。
发布于 2019-05-31 05:39:17
过滤尾部的一种比较自动的方法是使用cumsum()方法。这样,您就可以通过编程方式找到只有少量观察值出现的索引:
from io import StringIO
import pandas as pd
data=("""0 8012
25 3710
100 10794
200 11718
300 2489
500 7631
600 34
700 115
1000 3099
1200 1766
1600 63
2000 1538
2200 41
2500 208
2700 2138
5000 515
5500 201
8800 10
10000 10
10900 465
13000 9
16200 74
20000 518
21500 65
27000 64
53000 82
56000 1
106000 35
530000 3
""")
d=StringIO(data)
df = pd.read_csv(d,sep='\s+',names=['value','count'],index_col='value')
total=df['count'].sum()
df2 = df[ df['count'].cumsum()/total < 0.98 ]
print(df2)
这将保留89%的值,并丢弃其余的值。
输出为:
count
value
0 8012
25 3710
100 10794
200 11718
300 2489
500 7631
600 34
700 115
1000 3099
1200 1766
1600 63
2000 1538
2200 41
2500 208
2700 2138
5000 515
5500 201
8800 10
10000 10
然后你可以以任何你喜欢的方式进行绘图。
https://stackoverflow.com/questions/25319799
复制相似问题