2017-03-22 16 views
1

方法はここにある、pandas dfからbox plotを正しく作成するには?

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() 

Zero値は、旋回の期間中NaNから来て、私は希望私はパンダ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 

ボックスプロットを作成中にそれらを省略してください。だから、私はコードを使用し、

df_usa = df[(df['USA'] != 0)] 
    df_china = df[(df['CHINA'] != 0)] 

これらのコードは、実際には別々のdfを作成し、NUmpy行列に変換し、最後に、私はmatplotlibと一緒にそれらすべてを可視化します。ポイントを考慮すると、Numpy行列の長さは同じではないので、boxplot関数をdfと直接呼び出すことはできません。ここで

は、可視化はよくないと私は へのより良い方法があるかもしれない感情がゲット

enter image description here

、1及び2のニーズはそれぞれ中国と米国と交換する私の可視化です仕事が終わった。なにか提案を ?いくつかのサンプルコードは多くの助けになります。小数点以下2桁に丸めてdfを使用することができます。主な問題は、コードをエレガントにし、視覚化を改善することです。

+0

あなたの意見は何ですか?なぜあなたは良いと思うかを誰かが推測したいのですか? – piRSquared

答えて

1

私は、コードをよりsimplierことができると思う - 単にNaN0を交換してから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

+0

100k:D – Arefe

+0

@Areの交差のための受け入れとおめでとう - ありがとうございます。いい日! – jezrael

関連する問題