2015-05-19 258 views
1

當我嘗試在ipython筆記本中使用seaborn創建一個factorplot時,出現此錯誤。AttributeError:'numpy.int64'對象沒有屬性'startswith'

這裏的堆棧跟蹤的結尾:

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/axes.pyc in get_legend_handles_labels(self, legend_handler_map) 
    4317    label = handle.get_label() 
    4318    #if (label is not None and label != '' and not label.startswith('_')): 
-> 4319    if label and not label.startswith('_'): 
    4320     handles.append(handle) 
    4321     labels.append(label) 

AttributeError: 'numpy.int64' object has no attribute 'startswith' 

這裏是我的進口:

import numpy as np 
import pandas as pd 
from pandas import Series,DataFrame 

import math 

import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set_style('whitegrid') 
%matplotlib inline 

from sklearn.linear_model import LogisticRegression 
from sklearn.cross_validation import train_test_split 

from sklearn import metrics 

import statsmodels.api as sm 

,這裏是我的代碼:

df = sm.datasets.fair.load_pandas().data 
df['had_affair'] = df.affairs.apply(lambda x: 1 if x != 0 else 0) 
sns.factorplot('age', data=df, hue='had_affair', palette='coolwarm') 

這個問題似乎是在我用於hue的列是一個整數,而不是一個字符串。使用類似df['had_affair_str'] = df.had_affair.apply(str)創建一個新列,然後使用had_affair_str作爲我的hue使錯誤消失,但是我所遵循的在線教程使用此確切代碼而不會出現任何錯誤。這是matplotlib還是seaborn的已知問題?我的軟件包中有一個是過時的嗎?

下面是版本爲我的Python包:

ipython==3.1.0 
numpy==1.9.2 
pandas==0.16.1 
matplotlib==1.4.3 
seaborn==0.5.1 
scikit-learn==0.16.1 
statsmodels==0.6.1 

編輯:

輸出df.info()

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 6366 entries, 0 to 6365 
Data columns (total 11 columns): 
rate_marriage  6366 non-null float64 
age    6366 non-null float64 
yrs_married  6366 non-null float64 
children   6366 non-null float64 
religious   6366 non-null float64 
educ    6366 non-null float64 
occupation   6366 non-null float64 
occupation_husb 6366 non-null float64 
affairs   6366 non-null float64 
had_affair   6366 non-null int64 
had_affair_str  6366 non-null object 
dtypes: float64(9), int64(1), object(1) 
memory usage: 596.8+ KB 
+0

你確定「標籤」始終是一個字符串,如果標籤和不label.startswith(「_」):我相信ü期待它是字符串,它的即將到來的int64使用dtype來檢查。 –

+0

我正在關注一個在線教程,其中教師使用相同的代碼,但沒有錯誤。除此之外,對我來說matplotlib無法處理使用非字符串列作爲標籤是沒有意義的。看起來它應該足夠聰明,以便在需要使用'startswith'的地方調用'str'。我已經更新了我的問題以清楚地說明我相信這段代碼應該沒有錯誤地運行。 – mplis

+0

你的代碼在沒有任何dtype轉換的情況下運行良好,你可以發佈'df.info()' – EdChum

回答

0

matplotlib期待您的標籤系列had_affair的dtypes爲對象/ string,但它是numpy.int64

您可以使用此forcely轉換成numpy.int64字符串:

df['had_affair'] = df['had_affair'].astype(str)