2016-08-12 6 views
2

Ich habe drei Spalten von Daten: zwei Positionswerte und einen Datenwert. Ich möchte diese Daten so drehen, dass die Elemente einer Spalte die neuen Spalten werden und die Elemente einer anderen der ursprünglichen Spalten die Indizes werden. Diese Daten werden unter Verwendung von pcolormesh geplottet. pcolormesh erwartet, dass die Daten so strukturiert sind, dass sie nicht raten müssen, was zu tun ist. Das heißt, wenn eine Spalte mit Nans vorhanden ist, wird pcolormesh diese Spalte nicht korrekt ausfüllen. Also habe ich einen Code geschrieben, um die Daten korrekt zu formen, so dass sie pcolormesh zugeführt werden können.Python Pandas Reindexing entfernt Daten bei 0,0

Das Problem, das ich habe, ist, dass der Code Daten um x = 0.0 zu entfernen scheint. Ich denke, dass dies auf der Linie geschieht, wo der Datenrahmen neu indiziert wird, um die "fehlenden" Zeilen einzuschließen.

Ich habe ein Diagramm (und daher einige zusätzliche Code) hinzugefügt, um eine visuelle Hilfe für die Problemstellung zu geben. Das linke Diagramm zeigt die Originaldaten, das rechte Diagramm zeigt das Ergebnis, nachdem die Daten für pcolormesh umgeformt wurden.

Das von mir bereitgestellte Codebeispiel sollte nur durch Kopieren und Einfügen in einem Ipython-Notizbuch ausgeführt werden.

Alle Vorschläge sind willkommen. Vielleicht ist diese Lösung sehr kompliziert? Es fühlt sich sicher so an.

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

im Allgemeinen Sie ein minimales Beispiel in Ihrer Frage haben wollen. Sie haben eine Menge Code eingefügt. Können Sie einige unwesentliche Dinge entfernen, so dass nur der Code, der den Wert verursacht, verloren geht? – dbliss

Antwort

2

bin ich über den wahren Grund nicht sicher. Allerdings habe ich geändert Ihre min_max Funktion:

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

Und dann funktionierte es:

enter image description here

+0

Dies löst das Problem, das ich in meinem Beispiel erstellt habe, aber ich habe es anscheinend nicht geschafft, das Problem, das ich in meinem nicht-Beispiel-Code hatte, neu zu erstellen. – mnky9800n

Verwandte Themen