【问题标题】:Python boxplot out of columns of different lengthsPython箱线图出不同长度的列
【发布时间】:2014-06-26 00:50:23
【问题描述】:

我在 Python 中有以下数据框(实际的数据框要大得多,仅提供一个小示例):

      A     B     C     D     E     F
0  0.43  0.52  0.96  1.17  1.17  2.85
1  0.43  0.52  1.17  2.72  2.75  2.94
2  0.43  0.53  1.48  2.85  2.83  
3  0.47  0.59  1.58        3.14  
4  0.49  0.80        

我使用 df.values 将数据框转换为 numpy,然后将其传递给 boxplot。

当我尝试用这个 pandas 数据框制作箱线图时,从每列中选取的值的数量被限制为一列中的最少值数量(在本例中为 F 列)。有什么方法可以对每列的所有值进行箱线图绘制吗?

注意:我使用 df.dropna 删除每列中缺少值的行。但是,这会将数据框的大小调整为列长度的最小公分母,并弄乱绘图。

import prettyplotlib as ppl
import numpy as np
import pandas
import matplotlib as mpl
from matplotlib import pyplot

df = pandas.DataFrame.from_csv(csv_data,index_col=False)
df = df.dropna()
labels = ['A', 'B', 'C', 'D', 'E', 'F']
fig, ax = pyplot.subplots()
ppl.boxplot(ax, df.values, xticklabels=labels)
pyplot.show()

【问题讨论】:

  • 你应该发布 numpy/pandas 代码
  • 添加了代码。好的,我明白发生了什么。我使用 df.dropna 删除每列中缺少值的行。但是,这会将数据框的大小调整为列长度的最低公分母,并弄乱绘图。有什么解决办法吗?
  • 不删除 NaN 怎么样?我认为boxplot 会自己处理 NaN 值。

标签: python pandas boxplot prettyplotlib


【解决方案1】:

避免重新发明轮子的正确方法是在pandas 中使用.boxplot(),其中nan 处理正确:

In [31]:

print df
      A     B     C     D     E     F
0  0.43  0.52  0.96  1.17  1.17  2.85
1  0.43  0.52  1.17  2.72  2.75  2.94
2  0.43  0.53  1.48  2.85  2.83   NaN
3  0.47  0.59  1.58   NaN  3.14   NaN
4  0.49  0.80   NaN   NaN   NaN   NaN

[5 rows x 6 columns]
In [32]:

_=plt.boxplot(df.values)
_=plt.xticks(range(1,7),labels)
plt.savefig('1.png') #keeping the nan's and plot by plt

In [33]:

_=df.boxplot()
plt.savefig('2.png') #keeping the nan's and plot by pandas

In [34]:

_=plt.boxplot(df.dropna().values)
_=plt.xticks(range(1,7),labels)
plt.savefig('3.png') #dropping the nan's and plot by plt

【讨论】:

  • 谢谢,我会试试这个。您在某些代码之前的 -= 是什么?
  • 抑制终端中无用的输出。你看,plt.boxplot 将返回一个包含 3 个项目的列表。 plt.xticks 将返回一堆刻度对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2019-02-23
相关资源
最近更新 更多