2016-08-12 2 views
2

私は3つのデータ列を持っています:2つの位置値と1つのデータ値。このデータをピボットして、ある列の要素が新しい列になり、元の列の別の要素がインデックスになるようにしたいと思います。これらのデータは、pcolormeshを使用してプロットされます。 pcolormeshは、データが何をすべきかを推測する必要がないように構造化されることを期待しています。つまり、列がある場合、pcolormeshはこの列に正しく記入されません。だから、データを正しく整形してpcolormeshに送ることができるようにコードを書いています。python pandas reindexingは0.0でデータを削除します

問題は、コードがx = 0.0周辺のデータを削除しているようです。私はこれが、データフレームが「欠けている」行を含むように再索引付けされている行で発生していると思います。

問題文に視覚的な助言を与えるためにプロット(したがっていくつかの余分なコード)を追加しました。左のプロットは元のデータを示し、右のプロットはデータがpcolormeshのために再形成された後の結果を示しています。

私が提供したコード例は、ipythonノートブックでのみコピーして貼り付けて実行する必要があります。

ご提案は大歓迎です。おそらく、この解決策は非常に複雑ですか?それは確かにそう感じる。

enter image description here

%matplotlib inline 

import decimal 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

test_df = pd.DataFrame() 
test_df['x'] = [-2, -1.5, -0.9, -0.7, -0.5, 0.0, 0.5, 1.1] 
test_df['y'] = [1,2,4,5,6,7,5,4] 
test_df['v'] = np.random.randn(8) 

def get_precision(number): 
    """ 
    gives the precision, or decimal place, of the number 

    http://stackoverflow.com/questions/6189956/easy-way-of-finding-decimal-places 
    """ 
    return int(abs(decimal.Decimal(str(number)).as_tuple().exponent)) 

def min_max(column): 
    column_min = np.floor(column.min()) 
    column_max = np.ceil(column.max()) 
    return column_min, column_max 

def construct_df_for_pcolormesh(df, col, ix, values, columns_increment, index_increment): 
    columns_increment = 1.0/columns_increment 
    index_increment = 1.0/index_increment 

    columns_precision = get_precision(columns_increment) 
    index_precision = get_precision(index_increment) 

    columns_min, columns_max = min_max(df[col]) 
    index_min, index_max = min_max(df[ix]) 

    columns = np.linspace(columns_min, columns_max, (columns_max - columns_min)*columns_increment + 1) 
    index = np.linspace(index_min, index_max, (index_max - index_min)*index_increment + 1) 

    new_index = [(round(c, columns_precision), round(i, index_precision)) for c in columns for i in index] 

    df_for_pcolormesh = df.set_index([col, ix]).reindex(new_index).reset_index() 
    df_for_pcolormesh = df_for_pcolormesh.pivot(index=ix, columns=col, values=values) 
    return df_for_pcolormesh 

fig, (ax,ax1)= plt.subplots(1,2, sharey=True, sharex=True) 

test_df.plot(kind='scatter', x='x', y='y', s=100, grid=True, ax=ax) 
ax.set_ylim(0,8) 
ax.set_xlim(-2.5, 1.5) 
ax.set_title('Plot with all the data') 

data_df = construct_df_for_pcolormesh(test_df, 'x', 'y', 'v', 0.1, 0.1) 

depths = data_df.index 
xx = data_df.columns 

d, x = np.meshgrid(depths, xx) 
data = np.ma.masked_invalid(data_df.values) 

ax1.pcolormesh(x, d, data.transpose(), cmap='viridis') 
ax1.grid(True) 
ax1.set_ylim(0,8) 
ax1.set_xlim(-2.5, 1.5) 
ax1.set_title('Plot with missing\ndatapoint at x=0.0') 
+1

一般的に、あなたの質問に、最小限の例を持っていると思います。あなたにはたくさんのコードが含まれています。値を失う原因となるコードだけを残して、いくつかの本質的なものを削除できますか? – dbliss

答えて

2

私は、本当の理由はわからないです。しかし、私はあなたにmin_max機能を変更:

def min_max(column): 
    column_min = np.floor(column.min()) 
    column_max = np.ceil(column.max()) + 1 
    return column_min, column_max 

そして、それが働いた:

enter image description here

+0

これは、私の例で作成した問題を解決しますが、私は非典型的なコードで問題を再現できなかったようです。 – mnky9800n

関連する問題