python - 如何防止零值弄乱 Pandas 箱线图?

标签 python pandas

我有一个 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,

enter image description here

可视化效果不好,我感觉可能有更好的方法 把事做好。有什么建议吗?一些示例代码会有很大帮助。您可以使用 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()

graph

另一种可能的解决方案是使用 DataFrame.plot.box :

df.mask(df == 0).plot.box()

graph

Box Plots in docs

关于python - 如何防止零值弄乱 Pandas 箱线图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42942339/

相关文章:

python - Python解析JSON : how do I get has_key() working again after a change of format?

python - 大量列表列表的快速比较

python - 在包含数组元素的数据帧上应用 numpy 运算和向量索引的自然方法

python - 替换 DF 中的单元格,其中 DF 的单元格是其他 DF 中所需行的索引

python - Save.numpy masked array to a .numpy array with NaNs where mask == True

jquery - 如何从 Django(Python) 接收 jQuery 列表

python - 使用 python 正则表达式查找图像路径

python - 在 Pandas 数据框中查找最近日期时间的索引

python - Pandas – 根据单元格值选择列

python - 将长日期时间转换为日期 (dd/mm/yyyy)