Zusammenfassung: Das funktioniert nicht:Verständnis Pandas Datenrahmen Indizierung
df[df.key==1]['D'] = 1
aber dies tut:
df.D[df.key==1] = 1
Warum?
Fortpflanzung:
In [1]: import pandas as pd
In [2]: from numpy.random import randn
In [4]: df = pd.DataFrame(randn(6,3),columns=list('ABC'))
In [5]: df
Out[5]:
A B C
0 1.438161 -0.210454 -1.983704
1 -0.283780 -0.371773 0.017580
2 0.552564 -0.610548 0.257276
3 1.931332 0.649179 -1.349062
4 1.656010 -1.373263 1.333079
5 0.944862 -0.657849 1.526811
In [6]: df['D']=0.0
In [7]: df['key']=3*[1]+3*[2]
In [8]: df
Out[8]:
A B C D key
0 1.438161 -0.210454 -1.983704 0 1
1 -0.283780 -0.371773 0.017580 0 1
2 0.552564 -0.610548 0.257276 0 1
3 1.931332 0.649179 -1.349062 0 2
4 1.656010 -1.373263 1.333079 0 2
5 0.944862 -0.657849 1.526811 0 2
Das funktioniert nicht:
In [9]: df[df.key==1]['D'] = 1
In [10]: df
Out[10]:
A B C D key
0 1.438161 -0.210454 -1.983704 0 1
1 -0.283780 -0.371773 0.017580 0 1
2 0.552564 -0.610548 0.257276 0 1
3 1.931332 0.649179 -1.349062 0 2
4 1.656010 -1.373263 1.333079 0 2
5 0.944862 -0.657849 1.526811 0 2
aber dies tut:
In [11]: df.D[df.key==1] = 3.4
In [12]: df
Out[12]:
A B C D key
0 1.438161 -0.210454 -1.983704 3.4 1
1 -0.283780 -0.371773 0.017580 3.4 1
2 0.552564 -0.610548 0.257276 3.4 1
3 1.931332 0.649179 -1.349062 0.0 2
4 1.656010 -1.373263 1.333079 0.0 2
5 0.944862 -0.657849 1.526811 0.0 2
Meine Frage ist: Warum nur, dass die 2 Weg arbeiten? Ich kann keinen Unterschied in der Auswahl-/Indizierungslogik sehen.
Version ist 0.10.0
Edit: Dies sollte nicht mehr wie dies getan werden. Seit 0.1135 gibt es .loc
, siehe hier: http://pandas.pydata.org/pandas-docs/stable/indexing.html
Wie in den Antworten gesagt, scheint es ein numpiges Problem zu sein: werfen Sie einen Blick auf [diese Frage] (http://stackoverflow.com/q/9470604/1301710) für ein ähnliches Problem. Ich bin mir nicht sicher, ob es ein Problem von Ansicht gegen Kopie ist. – bmu
Ich verstehe jetzt, dass es klar ist (und eigentlich einfach) den Unterschied zwischen Ansicht und Kopie. Die erste Methode stellt nur eine Kopie bereit, die als Garbage Collection erfasst wird. Das zweite Verfahren liefert eine Ansicht, daher wird die Einstellung am ursprünglichen Datenrahmen vorgenommen. (siehe Dougals Kommentare unten) –