Python 使用不同长度列绘制箱线图

10 投票
1 回答
11774 浏览
提问于 2025-04-18 03:11

我在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        

我把这个数据表转换成numpy格式,使用df.values,然后把它传给箱线图(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()

1 个回答

8

正确的方法是使用 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

enter image description here

In [33]:

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

enter image description here

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

enter image description here

撰写回答