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.
%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')
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