включить НС как фактор в морском поле - PullRequest
0 голосов
/ 16 ноября 2018

Могу ли я показать пропущенные данные как дополнительный фактор в морском рождении? Погуглил сейчас.

Это простой код, который я использую:

ax = sns.boxplot(data=df, x=x, y=y)

Существует опция типа dropna для value_counts:

df['bla'].value_counts(dropna = False)

но я не смог найти его для боксов. Спасибо.

1 Ответ

0 голосов
/ 13 марта 2019

Нет, ты не можешь.По крайней мере, не напрямую с seaborn.

Проблемы, связанные со значениями NaN, были открыты в seaborn для линейного участка или парного участка .Однако билет от 2014 , похоже, указывает на то, что seaborn игнорирует пропущенные значения, начиная с 0,4.Это может быть подтверждено из исходного кода Seaborn categoryorical.py

box_data = remove_na(group_data)

Лучшее, что я могу придумать, - это создать дополнительный категориальный столбец, который выражает статус данных действительного / недействительного столбца.

Тогда я бы сделал 2 подпункта: - подсчет, который показывает nb допустимых / недопустимых данных для столбца, на который вы фокусируете внимание - некоторый условный морской график, основанный на этом столбце

Кроме того, этоможно получить доступ к коробочкам для того, чтобы показывал количество точек, учитываемых для каждого коробочника . Подобное может быть сделано для барплотов.

Другой подход заключается в использовании значения value_count intel и добавлении его к графику в виде аннотации

Пример:

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

def custom(val):
    if val >= 0.0:
        return np.NaN
    return val

df = pd.DataFrame(np.random.randn(500, 3))
df = df.rename(index=int, columns={0: 'col_1', 1: 'col_2', 2: 'col_3'})
df['four'] = 'bar'
df['five'] = df['col_1'] > 0
df['category'] = pd.cut(df['col_2'], bins=3, labels=['titi', 'tata', 'toto'])
df['col_3'] = df['col_1'].apply(custom)
df['is_col_3_na'] = pd.isna(df['col_3'])

fig, (ax1, ax2) = plt.subplots(1, 2)
validdf = df[(df['is_col_3_na'] == False)].copy()

sns.countplot(data=df, x='is_col_3_na', ax=ax1).set_title('col_3 valid/invalid data ratios')
sns.boxplot(data=validdf, x='category', y='col_3',
            #hue="category",
            ax=ax2)

print(df['is_col_3_na'].describe())
print(df['is_col_3_na'].value_counts())

# start: taken from https://python-graph-gallery.com/38-show-number-of-observation-on-boxplot/
# with proper modifications
# Calculate number of obs per group & median to position labels
medians = validdf.groupby(['category'])['col_3'].median().values
nobs = validdf['category'].value_counts().values
nobs = [str(x) for x in nobs.tolist()]
nobs = ["n: " + i for i in nobs]

# Add it to the plot
pos = range(len(nobs))
for tick, label in zip(pos, ax2.get_xticklabels()):
    ax2.text(pos[tick], medians[tick] + 0.03, nobs[tick],
             horizontalalignment='center', size='x-small', color='b', weight='semibold')
# end: taken from https://python-graph-gallery.com/38-show-number-of-observation-on-boxplot/
plt.show()

Вывод:

enter image description here

Печать на консоли (относительно столбца 'col_3'):

count      500
unique       2
top       True
freq       254
Name: is_col_3_na, dtype: object

True     254
False    246
Name: is_col_3_na, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...