2016-04-11 11 views
3

Meine ursprünglichen Daten sieht aus wie:Looping durch Datei mit .ix und .isin

SUBBASIN HRU HRU_SLP OV_N 
1   1 0.016155144 0.15 
1   2 0.015563287 0.14 
2   1 0.010589782 0.15 
2   2 0.011574839 0.14 
3   1 0.013865396 0.15 
3   2 0.01744597 0.15 
3   3 0.018983217 0.14 
3   4 0.013890315 0.05 
3   5 0.011792533 0.05 

Ich brauche für jeden SubBasin Zahlenwert von OV_N zu ändern:

hru = pd.read_csv('hru.csv') 
for i in hru.OV_N: 
    hru.ix[hru.SUBBASIN.isin([76,65,64,72,81,84,60,46,37,1,2]), 'OV_N'] = i*(1+df21.value[12]) 
    hru.ix[hru.SUBBASIN.isin([80,74,75,66,55,53,57,63,61,41,38,27,26,45,40,34,35,31,33,21,20,17,18,19,23,14,13,8,7,11,6,4,3,5,12]), 'OV_N'] = i*(1+df23.value[12]) 
    hru.ix[hru.SUBBASIN.isin([85,58,78,54,59,51,52,30,28,16,15,77,79,71,70,86,73,68,69,56,67,62,82,87,83,91,89,90,43,36,39,47,32,49,42,48,50,49,29,22,24,25,9,10]), 'OV_N'] = i*(1+df56.value[12]) 
    hru.ix[hru.SUBBASIN.isin([92,88,95,94,93]), 'OV_N'] = i*(1+df58.value[12]) 

wo df21.value [ 12] ist ein Wert aus einer TXT-Datei Der Code ergibt einen unendlichen Wert von OV_N für alle Unterbereiche, also gehe ich davon aus, dass das Durchlaufen einer Datei mehrere Male geht, aber ich kann keinen Fehler finden, und dieser Code arbeitete vorher mit unterschiedliche Anzahl von Teilbereichen.

Antwort

1

Es ist im Allgemeinen besser, nicht über Reihen in einem pandas DataFrame zu schlingen und zu indexieren. Die Transformation des DataFrame nach Spaltenoperationen ist der eher pandasnische Ansatz. Ein Pandas DataFrame kann als eine gezippte Kombination von Pandas-Serie betrachtet werden: Jede Spalte ist ihre eigene Pandas-Serie - alle teilen den gleichen Index. Operationen können auf eine oder mehrere Pandas Series angewendet werden, um eine neue Serie mit demselben Index zu erstellen. Operationen können auch angewendet werden, um eine Serie mit einem eindimensionalen Nummernfeld zu kombinieren, um eine neue Serie zu erstellen. Es ist hilfreich zu verstehen, pandas indexing - aber diese Antwort wird nur sequentielle Ganzzahlindizierung verwenden.

Um den Wert von OV_N für jede SUBBASIN-Nummer zu ändern:
Initialisieren Sie den hru DataFrame, indem Sie ihn aus der hru.csv wie in der ursprünglichen Frage einlesen. Hier initialisieren wir es mit den in der Frage angegebenen Daten.

import numpy as np 
import pandas as pd 

hru = pd.DataFrame({ 
    'SUBBASIN':[1,1,2,2,3,3,3,3,3], 
    'HRU':[1,2,1,2,1,2,3,4,5], 
    'HRU_SLP':[0.016155144,0.015563287,0.010589782,0.011574839,0.013865396,0.01744597,0.018983217,0.013890315,0.011792533], 
    'OV_N':[0.15,0.14,0.15,0.14,0.15,0.15,0.14,0.05,0.05]}) 

Erstellen einer separaten Pandas Serie, die und speichert alle Werte aus den verschiedenen Datenrahmen sammelt, das heißt df21, df23, df56, df58 und, in einem Ort. Dies wird verwendet, um Werte nach Index zu suchen. Nennen wir es subbasin_multiplier_ds. Lassen Sie uns annehmen, dass Werte von 21, 23, 56 und 58 aus der txt-Datei gelesen wurden. Ersetzen Sie diese durch die tatsächlichen Werte, die aus der TXT-Datei eingelesen wurden.

subbasin_multiplier_ds=pd.Series([21]*96) 
subbasin_multiplier_ds[80,74,75,66,55,53,57,63,61,41,38,27,26,45,40, 
    34,35,31,33,21,20,17,18,19,23,14,13,8,7,11,6,4,3,5,12] = 23 
subbasin_multiplier_ds[85,58,78,54,59,51,52,30,28,16,15,77,79,71,70, 
    86,73,68,69,56,67,62,82,87,83,91,89,90,43,36,39,47,32,49,42,48,50, 
    49,29,22,24,25,9,10] = 56 
subbasin_multiplier_ds[92,88,95,94,93] = 58 

ersetzen OV_N in hru Datenrahmen basierend auf Spalten in dem Datenrahmen und ein Nachschlag in subbasin_multiplier_ds von Index.

Ein numpy Array wird von .values ​​oben erstellt, damit die erwarteten Ergebnisse erzielt werden. Wenn Sie mit dem Entfernen von Werten experimentieren wollen, versuchen Sie zu sehen, was passiert.

+0

Vielen Dank für die Antwort SpeedCoder5. Ich muss nur eine Sache klären. In der Zeile: subbasin_multiplier_ds = pd.Series ([21] * 96), was genau sollte ich in Klammern setzen? Wie ich verstanden habe, meinen Sie, dass ich dort meine Werte multipliziert mit jeder Unterwohnungszahl eingeben muss? –

+0

[21] * 96 ist keine Multiplikation - es ist vielmehr eine pythonische Art, eine Liste zu deklarieren 96 Elemente, alle initialisiert auf 21. subbasin_multipiler_ds Werte enthalten jeweils was auch immer in Wert [12] von txt Dateien für jeden der Datenrahmen df21 gewesen wäre, df23 usw. Die ursprüngliche Frage enthielt 96 Elemente in den .isin-Prüfungen. Wenn jedoch eine unendliche Anzahl von Algorithmen benötigt wird, kann anstelle einer Serie eine Suche nach dem Lookup erforderlich sein. Wenn die Antwort die Frage beantwortet, markieren Sie sie bitte so. – SpeedCoder5

+0

OK, jetzt funktioniert es, danke! –