2016-04-06 6 views
0

Ich habe einen Datenrahmen von 5 bestehend Reihe abnehm (290 Zeilen pro Stück), deren Werte zwischen 0 und 1.Pandas: Reindizieren Datenrahmen wird nicht Anfangswerte halten

Die Daten sehen wie folgt aus:

A B C D E 
0.60 0.998494 1.0 1.0 1.0 1.0 
0.65 0.997792 1.0 1.0 1.0 1.0 
0.70 0.996860 1.0 1.0 1.0 1.0 
0.75 0.995359 1.0 1.0 1.0 1.0 
0.80 0.992870 1.0 1.0 1.0 1.0 

data

ich will die Datenrahmen indizieren, so daß zwischen jeder Reihe I Schritten von 0,01 haben. Ich habe pd.DataFrame.reindex versucht, aber ohne Erfolg: die eine Datenrahmen gibt, wo die meisten der Werte np.NaN

import pandas as pd 
df = pd.read_csv('http://pastebin.com/raw/yeHdk2Gq', index_col=0) 
print df.reindex(np.arange(0.6, 3.5, 0.025)).head() 

sind die nur zwei gültige Zeilen zurückgibt, und wandelt die 288 anderen NaN:

A B C D E 
0.600 0.998494 1.0 1.0 1.0 1.0 
0.625 NaN NaN NaN NaN NaN 
0.650 0.997792 1.0 1.0 1.0 1.0 
0.675 NaN NaN NaN NaN NaN 
0.700 NaN NaN NaN NaN NaN ##This row existed before reindexing 

Pandas können den neuen Index nicht mit den Anfangswerten vergleichen, obwohl es keine Rundungsprobleme zu geben scheint (der Anfangsindex hat nicht mehr als 2 Dezimalstellen).

Das scheint irgendwie auf meine Daten wie die folgenden Arbeiten im Zusammenhang wie beabsichtigt:

df = pd.DataFrame(np.random.randn(10,3), columns=['A', 'B', 'C'])\ 
     .reindex(np.arange(1, 10, 0.5)) 
print df.head() 

Welche gibt:

  A   B   C 
1.0 0.206539 0.346656 2.578709 
1.5  NaN  NaN  NaN 
2.0 1.164226 2.693394 1.183696 
2.5  NaN  NaN  NaN 
3.0 -0.532072 -1.044149 0.818853 

Vielen Dank für Ihre Hilfe!

+0

IIUC dann können Sie 'nennen df.apply (pd.Series.interpolate)' – EdChum

+0

sicher, dass es die Absicht ist, aber ich kann meinen Datenrahmen nicht neu indizieren: das Anwenden von 'pd.DataFrame.reindex' löscht die Anfangswerte (siehe dritten Codeblock, Zeile 0.70) – jodoox

+1

Können Sie überprüfen, ob 0,70 der tatsächliche Wert ist, kann es eine Art Float-Ungenauigkeit geben – EdChum

Antwort

0

Wie @Danche und @EdChum zeigen, war das eigentlich ein NumPy-Rundungsproblem. Die folgenden Werke:

df = pd.read_csv('http://pastebin.com/raw/yeHdk2Gq', index_col=0)\ 
     .reindex([round(i, 5) for i in np.arange(0.6, 3.5, 0.01)])\ 
     .interpolate(kind='cubic', axis=0) 

Returns als gedacht:

A B C D E 
0.60 0.998494 1.0 1.0 1.0 1.0 
0.61 0.998354 1.0 1.0 1.0 1.0 
0.62 0.998214 1.0 1.0 1.0 1.0 
0.63 0.998073 1.0 1.0 1.0 1.0 
0.64 0.997933 1.0 1.0 1.0 1.0 

Dank

1

Dies ist, weil die Genauigkeit von numpy.

In [31]: np.arange(0.6, 3.5, 0.025).tolist()[0:10] 

Out[31]: 
[0.6, 0.625, 0.65, 0.675, 0.7000000000000001, 0.7250000000000001, 
0.7500000000000001, 0.7750000000000001, 0.8000000000000002, 0.8250000000000002] 
+0

Danke, das war es – jodoox

Verwandte Themen