Pandas: BUG: fillna dengan inplace tidak berfungsi dengan pemilihan beberapa kolom berdasarkan loc

Dibuat pada 11 Des 2016  ·  3Komentar  ·  Sumber: pandas-dev/pandas

Contoh Kode, contoh copy-paste jika memungkinkan

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)

Keluaran:

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

Deskripsi masalah

Ini diharapkan untuk mengubah Nan menjadi -1 tetapi TIDAK .

Silakan lihat perbandingan berikut.

Perbandingan (1)

Sebaliknya, kode berikut berperilaku seperti yang diharapkan.
(Satu- satunya perbedaan adalah seleksi dengan iloc atau dengan 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)

Keluaran:

    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

Perbandingan (2)

Jika hanya satu kolom yang dipilih dengan loc, ia berperilaku dengan benar.

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)

Keluaran:

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

Output yang diharapkan dari contoh kode pertama

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

Keluaran pd.show_versions()

Tempel hasilnya di sini pd.show_versions () di sini

VERSI TERPASANG

commit: Tidak ada
python: 3.5.2.final.0
python-bits: 64
OS: Linux
Rilis OS: 2.6.32-358.14.1.el6.x86_64
mesin: x86_64
prosesor: x86_64
byteorder: sedikit
LC_ALL: Tidak ada
LANG: zh_TW.big5
LOCALE: zh_TW.big5

panda: 0.19.1
hidung: Tidak ada
pip: 9.0.1
setuptools: 27.2.0
Cython: Tidak ada
numpy: 1.11.2
scipy: 0.18.1
statsmodels: Tidak ada
xarray: Tidak ada
IPython: 5.1.0
sphinx: Tidak ada
patsy: Tidak ada
dateutil: 2.6.0.0
pytz: 2016.10
blosc: Tidak ada
kemacetan: Tidak ada
tabel: 3.3.0
numexpr: 2.6.1
matplotlib: 1.5.3
openpyxl: Tidak ada
xlrd: Tidak ada
xlwt: Tidak ada
xlsxwriter: Tidak ada
lxml: Tidak ada
bs4: Tidak ada
html5lib: Tidak ada
httplib2: Tidak ada
apiclient: Tidak ada
sqlalchemy: Tidak ada
pymysql: Tidak ada
psycopg2: Tidak ada
jinja2: 2.8
boto: Tidak ada
pandas_datareader: Tidak ada

Indexing Missing-data Usage Question

Komentar yang paling membantu

tidak hanya beberapa kolom, tetapi juga satu kolom.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
tidak bekerja,
tapi
df.loc[df.id==123, 'num'] = 123
berhasil

mengapa tidak mengedit fungsi fillna untuk menyesuaikannya di masa mendatang.
Sepertinya bug.

Semua 3 komentar

Anda sedang mengisi salinan. Menggunakan inplace adalah anti-pola. Kebanyakan operasi akan menampilkan SettingWithCopyWarning , tetapi dalam kasus ini hal ini tidak mudah dideteksi.

Menggunakan

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

Coba ini:
df.loc [:, ['C', 'D']] = df.loc [:, ['C', 'D']]. fillna (-1)
Saya mengalami kesulitan yang sama dengan .relplace dalam kode saya. Ini berhasil.

tidak hanya beberapa kolom, tetapi juga satu kolom.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
tidak bekerja,
tapi
df.loc[df.id==123, 'num'] = 123
berhasil

mengapa tidak mengedit fungsi fillna untuk menyesuaikannya di masa mendatang.
Sepertinya bug.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat