Pandas: バグ:インプレースのfillnaは、locによる複数の列の選択では機能しません

作成日 2016年12月11日  ·  3コメント  ·  ソース: pandas-dev/pandas

コードサンプル、可能であればコピーして貼り付けることができる例

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に変更することが期待されていますが、そうではありません

以下の比較をご覧ください。

比較(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

比較(2)

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()出力

ここに出力を貼り付けます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:なし

Indexing Missing-data Usage Question

最も参考になるコメント

複数の列だけでなく、1つの列もあります。
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
動作しない、
だが
df.loc[df.id==123, 'num'] = 123
できます

将来的にそれを適応させるためにfillna関数を編集して
バグのようです。

全てのコメント3件

あなたはコピーを埋めています。 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関数を編集して
バグのようです。

このページは役に立ちましたか?
0 / 5 - 0 評価