2016-08-12 29 views
2

我有三列數據:兩個位置值和一個數據值。我想旋轉這些數據,以便一列的元素成爲新列,另一列的元素成爲索引。這些數據將使用pcolormesh繪製。 pcolormesh預計數據的結構使得它不必猜測要做什麼。也就是說,如果有一列nans,則pcolormesh不會正確填寫此列。所以我寫了一些代碼來正確地塑造數據,以便它可以被輸入到pcolormeshpython 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