2017-05-10 3 views
1

Ich hoffe, das wurde noch nicht veröffentlicht, ich habe nichts gefunden, das mir geholfen hat. Also ich habe diese Datenrahmen dfDatenframe Zeile ändern - Panda Python

   Id Numero     Voie CodePostal   Commune \ 
1 940010005V-59  59   Rue d'Ablon  94480 Ablon-sur-Seine 
2 940010005V-61  61   Rue d'Ablon  94480 Ablon-sur-Seine 
3 940010005V-65  65   Rue d'Ablon  94480 Ablon-sur-Seine 

    Source Latitude Longitude \ 
1 C+O 48.721350 2.414291 
2 C+O 48.722434 2.413538 
3 OSM 48.721141 2.415030 
              Adresse AdresseGPS LatitudeGPS \ 
1   59 Rue d'Ablon, Ablon-sur-Seine, France      0.0 
2   61 Rue d'Ablon, Ablon-sur-Seine, France      0.0 
3   65 Rue d'Ablon, Ablon-sur-Seine, France      0.0 

    LongitudeGPS 
1   0.0 
2   0.0 
3   0.0 

ich es aus einer CSV importiert und hinzugefügt, um die letzten drei Spalten mit

df = df.assign(AdresseGPS="",LatitudeGPS = 0.,LongitudeGPS = 0.) 

Was ich tun möchte, ist diese letzten drei Spalten ändern unter Verwendung einer Funktion

def funcRow(dataIn): 
    dataOut = dataIn 
    dataOut['AdresseGPS'] = 't' 
    dataOut['LatitudeGPS'] = 1 
    return(dataOut) 

aber wenn ich

df.ix[1,] = funcRow(df.ix[1,]) 

bekomme ich folgende Fehlermeldung: Indexerror: Tupelindex außerhalb des Bereichs

ich beide

df.ix[1,] & funcRow(df.ix[1,]) 

gedruckt ich folgendes erhalten:

print df.ix[1,] 
    Id          940010005V-59 
    Numero            59 
    Voie          Rue d'Ablon 
    CodePostal          94480 
    Commune         Ablon-sur-Seine 
    Source            C+O 
    Latitude          48.7214 
    Longitude          2.41429 
    Adresse   59 Rue d'Ablon, Ablon-sur-Seine, France 
    AdresseGPS            
    LatitudeGPS           0 
    LongitudeGPS           0 
    Name: 1, dtype: object 

print funcRow 
    Id          940010005V-59 
    Numero            59 
    Voie          Rue d'Ablon 
    CodePostal          94480 
    Commune         Ablon-sur-Seine 
    Source            C+O 
    Latitude          48.7214 
    Longitude          2.41429 
    Adresse   59 Rue d'Ablon, Ablon-sur-Seine, France 
    AdresseGPS           t 
    LatitudeGPS           1 
    LongitudeGPS           0 
    Name: 1, dtype: object 

Ich bin ganz neu in Datenrahmen unter Verwendung von mit Python also habe ich viele Details zur Verfügung gestellt, nicht sicher, ob alles relevant ist. Ich habe das versucht, andere Funktionen wie loc oder iloc anstelle von ix zu verwenden, aber immer noch denselben Fehler zu erhalten. Jede Beratung wäre sehr willkommen :)

Antwort

1

Ich denke der "sicherste" Weg, dies zu lösen, ist mit .loc [] anstelle von .ix [].

Try this:

def funcRow(dataIn): 
    dataOut = dataIn 
    dataOut['AdresseGPS'] = 't' 
    dataOut['LatitudeGPS'] = 1 
    return(dataOut) 

df.loc[1,:] = funcRow(df.loc[1,:]) 

(Falls Sie sich nicht gewohnt, .LOC []: Das erste Argument ist die Zeilenauswahl, das zweite Argument ist die Spaltenauswahl und geben ":" Mittel Du wählst alles).

Wenn ich den Code oben ausführen, erhalte ich eine Warnmeldung, aber es gibt den aktualisierten Datenrahmen zurück, wenn ich df drucke.

(Bonus: Dieser Blog-Eintrag ist eine hervorragende Referenz, wenn loc, ILoc und ix Lernen: http://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/)

+0

Ich bekomme die Warnung, aber es funktioniert! Vielen Dank für die Lösung und den Blogbeitrag! Es wird nützlich sein! – arnino

+0

Ich bin froh, dass es funktioniert! Bitte klicken Sie auf die Check-Option neben meiner Antwort, um Ihre Frage als beantwortet zu markieren :) –

0

Nach der Dokumentation,

.ix [] unterstützt gemischte integer und Label-basierten Zugriff. Es ist hauptsächlich labelbasiert, wird aber auf den ganzzahligen Positionszugriff zurückfallen, wenn die entsprechende Achse nicht vom Integer-Typ ist.

Ich denke, Sie möchten letzten drei Spalten eines ganzen Datenrahmens Werte zugreifen.

Wenn es können Sie versuchen,

df.ix[:] = funcRow(df.ix[:]) #for whole rows 

oder

df.ix[start:end]=funcRow(df.ix[start:end]) #for specific rows 

oder wenn Sie wollen nur bestimmte Zeile zugreifen, dann können Sie diese verwenden,

df.ix[n] = funcRow(df.ix[n]) 

Ich hoffe, Es könnte Ihnen helfen, Ihr Problem zu lösen.

0

Diese Arbeit sollte:

df.ix[1] = funcRow(df.ix[1,]) 

ich wohl einen Blick auf den Quellcode nehmen müssen um zu sehen, warum das Folgende nicht funktioniert:

df.ix[1,] = funcRow(df.ix[1,]) 
+0

Verwenden Sie 'ix' - [Scheck Dokumente] (http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#) whatsnew-0200-api-breaking-deprecate-ix) – jezrael

Verwandte Themen