【问题标题】:How to handle seaborn pairplot errors when the dataset has NaN values?数据集具有 NaN 值时的 Seaborn 配对图错误
【发布时间】:2019-12-12 09:40:40
【问题描述】:

我有一个 pandas DataFrame,其中多列填充了数字和行,其中第一列是分类数据。显然,我在不同列的多行(当然不是整个空白行)中有 NaN 值(和零),毕竟这是工程和真实数据。

行在其他非 nan 列中具有有价值的数据。并且这些列在其他行中有有价值的数据,这些数据也不是 nan

问题是 sns.pairplot 不会忽略 NaN 值的相关性并返回错误(例如除以零、字符串到浮点数转换等)。

我看到有人说要使用 fillna() 方法,但我希望是否有人知道更优雅的方法来执行此操作,而不必通过该解决方案并花费大量时间来修复绘图、轴、过滤器等之后。我不喜欢这种解决方法。

与此人所报告的相似

https://github.com/mwaskom/seaborn/issues/1699

ZeroDivisionError: 0.0 不能提升到负幂

enter image description here

【问题讨论】:

  • 在绘图之前先从数据中删除 nans。
  • 这不是重点,因为这些行在其他非 nan 列中有有价值的数据。
  • 并且这些列在其他行中有有价值的数据,这些数据也不是nan
  • Seaborn 无论如何都需要长格式数据集,因此任何列中带有 nan 的行都没有用,可以删除。
  • 绝对不是,我那里有重要数据,我只需要对图忽略任何处理 nan 值的相关性并传递它。这是一个简单的概念。

标签: python pandas plot seaborn nan


【解决方案1】:

Seaborn 的PairGrid 函数可让您创建所需的情节。 PairGridsns.pairplot 灵活得多。创建的任何PairGrid 都具有三个部分:上三角形、下三角形和对角线。

对于每个部分,您可以定义自定义的绘图功能。上下三角形部分可以采用任何接受两个特征数组(例如plt.scatter)以及任何相关关键字(例如marker)的绘图函数。对角线部分接受一个绘图函数,该函数除了相关关键字外,还具有单个特征数组作为输入(例如plt.hist)。

为了您的目的,您可以过滤掉自定义函数中的 NaN:

from sklearn import datasets
import pandas as pd
import numpy as np
import seaborn as sns

data = datasets.load_iris()
iris = pd.DataFrame(data.data, columns=data.feature_names)

# break iris dataset to create NaNs
iris.iat[1, 0] = np.nan
iris.iat[4, 0] = np.nan
iris.iat[4, 2] = np.nan
iris.iat[5, 2] = np.nan

# create customized scatterplot that first filters out NaNs in feature pair
def scatterFilter(x, y, **kwargs):

    interimDf = pd.concat([x, y], axis=1)
    interimDf.columns = ['x', 'y']
    interimDf = interimDf[(~ pd.isnull(interimDf.x)) & (~ pd.isnull(interimDf.y))]

    ax = plt.gca()
    ax = plt.plot(interimDf.x.values, interimDf.y.values, 'o', **kwargs)

# Create an instance of the PairGrid class.
grid = sns.PairGrid(data=iris, vars=list(iris.columns), size = 4)

# Map a scatter plot to the upper triangle
grid = grid.map_upper(scatterFilter, color='darkred')

# Map a histogram to the diagonal
grid = grid.map_diag(plt.hist, bins=10, edgecolor='k', color='darkred')

# Map a density plot to the lower triangle
grid = grid.map_lower(scatterFilter, color='darkred')

这将产生以下情节: Iris Seaborn PairPlot

PairPlot 允许您绘制等高线图、使用描述性统计数据注释面板等。有关更多详细信息,请参阅here

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 2020-08-05
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2017-09-24
    • 2020-09-25
    相关资源
    最近更新 更多