ValueError: "color kwarg must have one color per dataset"

Viewed 1641

I have a dataset regarding some used cars from eBay, which I tried to plot after I edited the dataset as follows:

import pandas as pd

df = pd.read_csv("./autos.csv.bz2", encoding = "iso8859-1")
df = df.drop(["dateCrawled", "abtest", "dateCreated", "nrOfPictures", "lastSeen", "postalCode", "seller", "offerType"], axis = 1)

import numpy as np

df["monthOfRegistration"] = np.where(df["monthOfRegistration"] == 0, 6, df["monthOfRegistration"])


df["registration"] = df["yearOfRegistration"] + (df["monthOfRegistration"] - 1) / 12

df = df.drop(["yearOfRegistration", "monthOfRegistration"], axis = 1)


df = df.drop(df[df["price"] == 0].index)
df = df.drop(df[df["powerPS"] == 0].index)


print(df["notRepairedDamage"].unique())
print(df["notRepairedDamage"])

df["notRepairedDamage"] = np.where(df["notRepairedDamage"] == "ja", 1, df["notRepairedDamage"])
df["notRepairedDamage"] = np.where(df["notRepairedDamage"] == "nein", 0, df["notRepairedDamage"])


df = df[df["notRepairedDamage"].notnull()]

I tried to plot the data with matplotlib using seaborn.pairplot but got the following error:

ValueError: color kwarg must have one color per dataset

I do only get the plots with the relative frequencies of the first 3 lines, all the other graphs are empty, also relative frequencies in line 4 and 5.

Matplotlib seaborn, example image

df = df[(df["price"] < 100000) & (df["powerPS"] < 2000)

from IPython import get_ipython
get_ipython().run_line_magic('matplotlib', 'inline')

import seaborn as sns

g = sns.pairplot(df)

I assume that something did go wrong when I edited my dataset. Is there anyone who could help me? That would be great! Thank you very much!

2 Answers

Following your comment, an example snippet, which hopefully can help you. Maybe the issue is with IPython? Unfortunately, I do not know. Having your dataset available would definitely help.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

a = pd.DataFrame()
a['One'] = [1, 3, 3, 2, 1]
a['Two'] = ['ja', 'ja', 'nein', 'ja', 'nein']
a['Two'] = np.where(a['Two'] == 'ja', 1, a['Two'])
a['Two'] = np.where(a['Two'] == 'nein', 0, a['Two'])
a = a[a['Two'].notnull()]
print(a)
sns.pairplot(a)
plt.show()

This prints

   One Two
0    1   1
1    3   1
2    3   0
3    2   1
4    1   0

and displays

enter image description here

The problem comes from the fact that pairplot only accepts some pandas types in the PairGrid: float or int, but not Object or Int64 for exemple (at least for some versions of matplotlib and/or seaborn: 3.0.3 and 0.9.0 respectivly generates that error).

Using .astype('float') to modify the concerned series before plotting in the following exemple solves the problem as a.One is set to Int64 and a.Two is initially an Object type:

a = pd.DataFrame()
a['One'] = [1, 3, 3, 2, 1]
a['One']=a['One'].astype('Int64')
a['Two'] = ['yes', 'yes', 'no', 'yes', 'no']
a['Two'] = np.where(a['Two'] == 'yes', 1, a['Two'])
a['Two'] = np.where(a['Two'] == 'no', 0, a['Two'])
a['One']=a['One'].astype('int')
a['Two']=a['Two'].astype('int')
sns.pairplot(a)
plt.show()

Remark that if you have some NaN in your dataframe, float is the only option as Int64 accepts missing values but not the Int type.

Related