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)
出力:
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
Nanを-1に変更することが期待されていますが、そうではありません。
以下の比較をご覧ください。
逆に、次のコードは期待どおりに動作します。
(唯一の違いは、 ilocまたは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)
出力:
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
locで列を1つだけ選択すると、正しく動作します。
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)
出力:
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()
出力コミット:なし
python:3.5.2.final.0
python-ビット:64
OS:Linux
OSリリース:2.6.32-358.14.1.el6.x86_64
マシン:x86_64
プロセッサー:x86_64
バイトオーダー:少し
LC_ALL:なし
言語:zh_TW.big5
ローカル:zh_TW.big5
パンダ:0.19.1
鼻:なし
ピップ:9.0.1
setuptools:27.2.0
Cython:なし
numpy:1.11.2
scipy:0.18.1
statsmodels:なし
xarray:なし
IPython:5.1.0
スフィンクス:なし
patsy:なし
dateutil:2.6.0
pytz:2016.10
blosc:なし
ボトルネック:なし
テーブル:3.3.0
numexpr:2.6.1
matplotlib:1.5.3
openpyxl:なし
xlrd:なし
xlwt:なし
xlsxwriter:なし
lxml:なし
bs4:なし
html5lib:なし
httplib2:なし
apiclient:なし
sqlalchemy:なし
pymysql:なし
psycopg2:なし
jinja2:2.8
boto:なし
pandas_datareader:なし
あなたはコピーを埋めています。 inplace
はアンチパターンです。 ほとんどの操作ではSettingWithCopyWarning
が表示されますが、この場合、これは簡単には検出できません。
使用する
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
これを試して:
df.loc [:、['C'、 'D']] = df.loc [:、['C'、 'D']]。fillna(-1)
コード内の.relplaceでも同じ問題が発生していました。 これはうまくいきました。
複数の列だけでなく、1つの列もあります。
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
動作しない、
だがdf.loc[df.id==123, 'num'] = 123
できます
将来的にそれを適応させるためにfillna関数を編集して
バグのようです。
最も参考になるコメント
複数の列だけでなく、1つの列もあります。
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
動作しない、
だが
df.loc[df.id==123, 'num'] = 123
できます
将来的にそれを適応させるためにfillna関数を編集して
バグのようです。