Pandas: BUG: fillna with inplace funktioniert nicht mit der Auswahl mehrerer Spalten nach loc

Erstellt am 11. Dez. 2016  ·  3Kommentare  ·  Quelle: pandas-dev/pandas

Codebeispiel, wenn möglich ein kopierfähiges Beispiel

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

Problembeschreibung

Es wird erwartet, dass die Nan auf -1 geändert wird, dies ist jedoch NICHT der Fall.

Bitte beachten Sie die folgenden Vergleiche.

Vergleich (1)

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

Vergleich (2)

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

Erwartete Ausgabe des ersten Codebeispiels

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

Ausgabe von pd.show_versions()

Fügen Sie die Ausgabe hier ein. Pd.show_versions () hier

INSTALLIERTE VERSIONEN

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

Indexing Missing-data Usage Question

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen