首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Pandas中使用重尾数据绘制直方图

在Pandas中使用重尾数据绘制直方图
EN

Stack Overflow用户
提问于 2014-08-15 08:57:13
回答 2查看 5.9K关注 0票数 3

我经常使用具有非常“长尾”的数据。我想绘制直方图来总结分布,但当我尝试使用熊猫时,我得到了一个条形图,其中有一个巨大的可见条形图,其他所有内容都不可见。

以下是我正在使用的系列的一个示例。因为它很长,所以我使用了value_counts(),所以它可以放在这个页面上。

代码语言:javascript
复制
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指数来表示出现的百分比,而不是绝对数字。然而,我不明白我如何自动地去做这件事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-15 14:12:44

代码语言:javascript
复制
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]

以条形图形式绘制:

代码语言:javascript
复制
fig = df.value.value_counts().sort_index().plot(kind="bar")
plt.savefig("figure.png")

作为一个直方图(限定值为5000 &低于这个值,数据的97%以上):我喜欢使用linspace来控制存储桶。

代码语言:javascript
复制
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)并更新直方图。

票数 6
EN

Stack Overflow用户

发布于 2019-05-31 05:39:17

过滤尾部的一种比较自动的方法是使用cumsum()方法。这样,您就可以通过编程方式找到只有少量观察值出现的索引:

代码语言:javascript
复制
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%的值,并丢弃其余的值。

输出为:

代码语言:javascript
复制
       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

然后你可以以任何你喜欢的方式进行绘图。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25319799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档