df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.loc[:, ['C', 'D']].fillna(-1, inplace=True)
display(df)
Ausgabe:
A B C D
0 1.387547 -1.299578 0.360015 1.290783
1 -0.395182 -0.112581 NaN NaN
2 -0.649372 -1.831869 -0.103746 0.533153
Es wird erwartet, dass die Nan auf -1 geändert wird, dies ist jedoch NICHT der Fall.
Bitte beachten Sie die folgenden Vergleiche.
Im Gegensatz dazu verhalten sich die folgenden Codes wie erwartet.
(Der einzige Unterschied ist die Auswahl nach iloc oder loc )
df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.iloc[:, 2:4].fillna(-1, inplace=True)
display(df)
Ausgabe:
A B C D
0 -0.522821 -1.600520 -1.468871 0.715790
1 0.493071 0.722474 -1.000000 -1.000000
2 0.545852 -0.877946 0.993169 -0.582661
Wenn nur eine Spalte mit loc ausgewählt ist, verhält sie sich ordnungsgemäß.
df = pd.DataFrame(np.random.randn(3, 4), columns=list('ABCD'))
df.iloc[1, 2:4] = np.nan
df.loc[:, 'C'].fillna(-1, inplace=True)
display(df)
Ausgabe:
A B C D
0 -0.549106 0.261093 -1.278554 2.017178
1 -1.424498 0.439482 -1.000000 NaN
2 -1.281520 1.190736 0.356319 0.416363
A B C D
0 1.181106 1.101231 -0.198445 0.295238
1 -0.654265 -1.129840 -1.000000 -1.000000
2 -1.070404 0.096556 0.499020 -1.835347
pd.show_versions()
Festschreiben: Keine
Python: 3.5.2.final.0
Python-Bits: 64
Betriebssystem: Linux
Betriebssystemversion: 2.6.32-358.14.1.el6.x86_64
Maschine: x86_64
Prozessor: x86_64
Byteorder: wenig
LC_ALL: Keine
LANG: zh_TW.big5
LOCALE: zh_TW.big5
Pandas: 0.19.1
Nase: Keine
pip: 9.0.1
setuptools: 27.2.0
Cython: Keine
Anzahl: 1.11.2
scipy: 0.18.1
Statistikmodelle: Keine
xarray: Keine
IPython: 5.1.0
Sphinx: Keine
Patsy: Keine
Datum: 2.6.0
pytz: 2016.10
blosc: Keine
Engpass: Keine
Tabellen: 3.3.0
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Keine
xlrd: Keine
xlwt: Keine
xlsxwriter: Keine
lxml: Keine
bs4: Keine
html5lib: Keine
httplib2: Keine
apiclient: Keine
sqlalchemy: Keine
pymysql: Keine
psycopg2: Keine
jinja2: 2.8
Boto: Keine
pandas_datareader: Keine
Sie füllen eine Kopie. Die Verwendung von inplace
ist ein Anti-Pattern. Die meisten Operationen zeigen ein SettingWithCopyWarning
, aber in diesem Fall ist dies nicht leicht zu erkennen.
Verwenden
In [11]: df[['C', 'D']] = df[['C', 'D']].fillna(-1)
In [12]: df
Out[12]:
A B C D
0 0.236782 1.408896 -0.199882 0.803165
1 -1.763881 0.232414 -1.000000 -1.000000
2 0.878515 -0.394800 0.429696 -1.829569
Versuche dies:
df.loc [:, ['C', 'D']] = df.loc [:, ['C', 'D']]. fillna (-1)
Ich hatte die gleichen Schwierigkeiten mit einem .relplace in meinem Code. Das hat funktioniert.
nicht nur mehrere Spalten, sondern auch eine Spalte.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
arbeite nicht,
aber
df.loc[df.id==123, 'num'] = 123
Es klappt
Warum nicht die Fillna- Funktion bearbeiten, um sie in Zukunft anzupassen
Es scheint wie ein Fehler.
Hilfreichster Kommentar
nicht nur mehrere Spalten, sondern auch eine Spalte.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
arbeite nicht,
aber
df.loc[df.id==123, 'num'] = 123
Es klappt
Warum nicht die Fillna- Funktion bearbeiten, um sie in Zukunft anzupassen
Es scheint wie ein Fehler.