我有一个 pandas df
,旋转后,它打印如下,
country CHINA USA
0 119.02 0.0
1 121.20 0.0
3 112.49 0.0
4 113.94 0.0
5 114.67 0.0
6 111.77 0.0
7 117.57 0.0
......................
......................
6648 0.00 420.0
6649 0.00 420.0
6650 0.00 420.0
6651 0.00 420.0
6652 0.00 420.0
6653 0.00 420.0
6654 0.00 500.0
6655 0.00 500.0
6656 0.00 390.0
6657 0.00 450.0
6658 0.00 420.0
6659 0.00 420.0
6660 0.00 450.0
方法在这里,
def visualize_box_plot(df):
df = df[df.outlier != 1]
df = pd.pivot_table(df,
index=df.index,
columns = df['country'],
values='value',
fill_value = 0)
df.CHINA = df.CHINA.round(2)
df.USA = df.USA.round(2)
# this is the prints
# provided earlier
print df
df_usa = df[(df['USA'] != 0)]
df_china = df[(df['CHINA'] != 0)]
usa = df_usa.as_matrix()[:, -1]
china = df_china.as_matrix()[:,0]
print "USA:", len(usa), " ", "CHINA: ", len(china)
# unequal length
# USA: 1673 CHINA: 4384
x = [china, usa]
plt.boxplot(x)
plt.show()
零
值来自旋转期间的NaN
,我想在绘制箱线图时省略它们。所以,我使用代码,
df_usa = df[(df['USA'] != 0)]
df_china = df[(df['CHINA'] != 0)]
这些代码实际上创建了单独的 df
并转换为 NUmpy
矩阵,最后,我使用 matplotlib
将它们全部可视化。需要考虑的一点是,Numpy
矩阵的长度不相同,因此,我不能直接使用 df
调用 boxplot
函数>。
这是我的可视化,其中 1 和 2 需要分别替换为 CHINA 和 USA,
可视化效果不好,我感觉可能有更好的方法
把事做好。有什么建议吗?一些示例代码会有很大帮助。您可以使用 df
四舍五入到小数点后 2 位数字。主要问题是让代码变得优雅,并且更好地提高可视化效果。
最佳答案
我认为代码可以更简单 - 只需将 0
替换为 NaN
,然后调用 DataFrame.boxplot
:
print (df.mask(df == 0))
#alternative solution
#print (df.replace(0,np.nan))
CHINA USA
country
0 119.02 NaN
1 121.20 NaN
3 112.49 NaN
4 113.94 NaN
5 114.67 NaN
6 111.77 NaN
7 117.57 NaN
6648 NaN 420.0
6649 NaN 420.0
6650 NaN 420.0
6651 NaN 420.0
6652 NaN 420.0
6653 NaN 420.0
6654 NaN 500.0
6655 NaN 500.0
6656 NaN 390.0
6657 NaN 450.0
6658 NaN 420.0
6659 NaN 420.0
6660 NaN 450.0
df.mask(df == 0).boxplot()
另一种可能的解决方案是使用 DataFrame.plot.box
:
df.mask(df == 0).plot.box()
关于python - 如何防止零值弄乱 Pandas 箱线图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42942339/