Seaborn绘制了kdeplot但不是distplot

时间:2016-02-14 08:40:54

标签: python pandas matplotlib analytics seaborn

我想绘制一个由couchdb组成的pandas dataframe列中的数据。这是数据的代码和输出:

print df4.Patient_Age

Doc_ID
000103f8-7f48-4afd-b532-8e6c1028d965    99
00021ec5-9945-47f7-bfda-59cf8918f10b    92
0002510f-fb89-11e3-a6eb-742f68319ca7    32
00025550-9a97-44a4-84d9-1f6f7741f973    73
0002d1b8-b576-4db7-af55-b3f26f7ca63d    49
0002d40f-2b45-11e3-8f66-742f68319ca7    42
000307eb-18a6-47cd-bb03-33e484fad029    18
00033d3d-1345-4739-9522-b41b8db3ee23    42
00036d2e-0a51-4cfb-93d1-3e137a026f19    42
0003b054-5f3b-4553-8104-f71d7a940d84    10
Name: Patient_Age, dtype: object

如果我执行此代码:

sns.kdeplot(df4.Patient_Age)

按预期生成图表。但是,当我运行时:

sns.distplot(df4.Patient_Age)

我在distplot中收到以下错误:

TypeError: unsupported operand type(s) for /: 'unicode' and 'long'

要纠正错误,我使用:

df4.Patient_Age = [int(i) for i in df4.Patient_Age]
all(isinstance(item,int) for item in df4.Patient_Age)

输出结果为:

False

我想了解的是:

  1. 为什么kdeplot是先生成的而不是histplot?
  2. 当我将数据类型更改为int时,为什么还要获得False?如果数据不是int(由False指示),为什么histplot在转换后有效?

1 个答案:

答案 0 :(得分:0)

问题是您的值不是数字。如果强制它们为整数或浮点数,它将起作用。

from io import StringIO

import pandas
import seaborn
seaborn.set(style='ticks')

data = StringIO("""\
Doc_ID                                  Age 
000103f8-7f48-4afd-b532-8e6c1028d965    99
00021ec5-9945-47f7-bfda-59cf8918f10b    92
0002510f-fb89-11e3-a6eb-742f68319ca7    32
00025550-9a97-44a4-84d9-1f6f7741f973    73
0002d1b8-b576-4db7-af55-b3f26f7ca63d    49
0002d40f-2b45-11e3-8f66-742f68319ca7    42
000307eb-18a6-47cd-bb03-33e484fad029    18
00033d3d-1345-4739-9522-b41b8db3ee23    42
00036d2e-0a51-4cfb-93d1-3e137a026f19    42
0003b054-5f3b-4553-8104-f71d7a940d84    10
""")

df = pandas.read_table(data, sep='\s+')
df['Age'] = df['Age'].astype(float)

df.info()
# prints

<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 2 columns):
Doc_ID    10 non-null object
Age       10 non-null float64
dtypes: float64(1), object(1)
memory usage: 240.0+ bytes

那么:

seaborn.distplot(df['Age'])

给我:

enter image description here