获取箱线图的数据 - 熊猫

Man*_*mal 7 python pandas

我需要获取生成的统计数据,以便在Pandas中绘制一个箱形图(使用数据框创建箱形图).即Quartile1,Quartile2,Quartile3,较低的晶须值,较高的晶须值和异常值.我尝试了以下查询来绘制boxplot.

import pandas as pd
df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])
pd.DataFrame.boxplot(df,return_type = 'both')
Run Code Online (Sandbox Code Playgroud)

有没有办法做到而不是手动计算值?

小智 12

一种选择是使用图中的y数据 - 可能对离群值(传单)最有用

_, bp = pd.DataFrame.boxplot(df, return_type='both')

outliers = [flier.get_ydata() for flier in bp["fliers"]]
boxes = [box.get_ydata() for box in bp["boxes"]]
medians = [median.get_ydata() for median in bp["medians"]]
whiskers = [whiskers.get_ydata() for whiskers in bp["whiskers"]]
Run Code Online (Sandbox Code Playgroud)

但是使用其中任何一个(包括IQR)获得其他值可能更为直接

quantiles = df.quantile([0.01, 0.25, 0.5, 0.75, 0.99])
Run Code Online (Sandbox Code Playgroud)

或者,正如WoodChopper所建议的那样

stats = df.describe()
Run Code Online (Sandbox Code Playgroud)


Tre*_*ney 6

  • 要获取箱线图数据,请使用matplotlib.cbook.boxplot_stats,它返回用于绘制一系列箱线图和须线图的统计字典列表matplotlib.axes.Axes.bxp
    • 要获取箱线图统计数据,请将 an 传递arrayboxplot_stats
      • 这不是特定于pandas.
  • ,的默认绘图引擎pandasmatplotlib,因此使用boxplot_stats将返回 的正确指标pandas.DataFrame.plot.box
  • 使用,将感兴趣的数字列作为传递给。boxplot_statsarraydf.values
  • NaN列中不能有值。
  • 测试于python 3.11.4, pandas 2.1.0,matplotlib 3.7.2
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.cbook import boxplot_stats
import numpy as np

# test dataframe
np.random.seed(346)
df = pd.DataFrame(np.random.rand(100, 5), columns=['A', 'B', 'C', 'D', 'E'])

# plot the dataframe as needed
ax = df.plot.box(figsize=(8, 6), showmeans=True, grid=True)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • array通过传递to来提取箱线图指标boxplot_stats
    • boxplot_stats(df)或者boxplot_stats(df.values)会起作用。
    • 它们的dicts顺序与 中的列数组的顺序相同df
    • 该数据没有异常值 ,fliers因为它是使用 生成的numpy.random
# create a dict of dicts with the column names as the keyword for each dict of statistics
stats = dict(zip(df.columns, boxplot_stats(df)))

print(stats)
[out]:
{'A': {'cihi': 0.6008396701195271,
       'cilo': 0.45316512285356997,
       'fliers': array([], dtype=float64),
       'iqr': 0.47030110594253877,
       'mean': 0.49412631128104645,
       'med': 0.5270023964865486,
       'q1': 0.2603486498337239,
       'q3': 0.7306497557762627,
       'whishi': 0.9941975539538199,
       'whislo': 0.00892072823759571},
 'B': {'cihi': 0.5460977498205477,
       'cilo': 0.39283808760835964,
       'fliers': array([], dtype=float64),
       'iqr': 0.4880880962171596,
       'mean': 0.47578540593013985,
       'med': 0.4694679187144537,
       'q1': 0.2466015651284032,
       'q3': 0.7346896613455628,
       'whishi': 0.9906905357196321,
       'whislo': 0.002613905425137064},
 'C': {'cihi': 0.6327876179340386,
       'cilo': 0.47317829117336885,
       'fliers': array([], dtype=float64),
       'iqr': 0.5083099578365278,
       'mean': 0.5202481643792808,
       'med': 0.5529829545537037,
       'q1': 0.24608370844800756,
       'q3': 0.7543936662845353,
       'whishi': 0.9968264819096214,
       'whislo': 0.008450848029956215},
 'D': {'cihi': 0.5429786764060252,
       'cilo': 0.40089287519667627,
       'fliers': array([], dtype=float64),
       'iqr': 0.4525025516221303,
       'mean': 0.4948030963370377,
       'med': 0.4719357758013507,
       'q1': 0.279181107815125,
       'q3': 0.7316836594372553,
       'whishi': 0.9836196084903415,
       'whislo': 0.019864664399723786},
 'E': {'cihi': 0.5413819754851169,
       'cilo': 0.3838462046931251,
       'fliers': array([], dtype=float64),
       'iqr': 0.5017062764076173,
       'mean': 0.4922357500877824,
       'med': 0.462614090089121,
       'q1': 0.2490034171367362,
       'q3': 0.7507096935443536,
       'whishi': 0.9984043081918205,
       'whislo': 0.0036707224412856343}}
Run Code Online (Sandbox Code Playgroud)