2016-11-02 1 views
1

Dies sollte ein wirklich einfaches sein, aber ich bin kurz davor, meinen Kopf gegen die Wand zu schlagen, weil ich herausfinden kann, wie das geht. Jede Hilfe würde sehr geschätzt werden.Einstellwerte basierend auf Zahlenvergleich mit gemischten Spalten - Pandas

Ich habe eine Pandas DataFrame mit einer gemischten Typ-Spalte (es ist eigentlich Dezimal, Float und String, aber nehmen wir einfach an, es ist Float und String). Ich versuche, den Wert aller Schwimmer zu setzen, die kleiner als Null auf 0. Was ich versucht habe, so weit:

In [1]: import pandas as pd 
In [2]: ex = [-1, 0, 'rabbit', 'carrots', 10, 24, 'dogs'] 
In [3]: df = pd.DataFrame(data = ex, columns=['Test'], index = range(len(ex))) 
In [4]: Mask = df.loc[:,'Test'].apply(type) != str 
In [5]: df.loc[Mask,:] < 0 
Out[5]:  Test 
     0 True 
     1 False 
     4 False 
     5 False 

Ok groß, so das funktioniert, aber jetzt brauche ich dies passieren in eine .ix zu tatsächlich setzen Sie den Wert -1, auf Null, und hier ist, wo es schwierig wird (was auch völlig verständlich ist, da der Index nicht von der gleichen Größe wie der ursprüngliche Index ist)

In [6]: df.ix[df.loc[Mask,'Test'] < 0,'Test'] = 0 
Out[6]: [...] IndexingError: Unalignable boolean Series key provided 

Dies ist vom Kurs abgekommen vollständig verständlich, aber ich weiß nicht, wie ich das beheben kann.

Ich versuchte .index.tolist() eine zweite Maske zu erzeugen, mir die Indexwerte zu erhalten, auf dem ich handeln sollte, aber dies gibt nur alle Indizes des df.loc[Mask,'Test'] < 0 Vergleich, und zwar unabhängig davon, ob sie wahr oder falsch.

Jede Hilfe würde sehr geschätzt werden.

Grüße,

Tim

Antwort

2
mask = df['Test'].map(lambda x: isinstance(x, (int, float)) and x < 0) 
df.ix[mask, 'Test'] = 0 
+0

Dank! Das funktioniert, hat mir sehr geholfen! –

+0

@ Tim.Lucas Froh, es hilft! –

Verwandte Themen