Pandas: ОШИБКА: fillna с inplace не работает с выбором нескольких столбцов по loc

Созданный на 11 дек. 2016  ·  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 выбран только один столбец, он ведет себя правильно.

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 () здесь

УСТАНОВЛЕННЫЕ ВЕРСИИ

коммит: Нет
питон: 3.5.2.final.0
биты Python: 64
ОС: Linux
Релиз ОС: 2.6.32-358.14.1.el6.x86_64
машина: x86_64
процессор: x86_64
byteorder: маленький
LC_ALL: Нет
ЯЗЫК: zh_TW.big5
МЕСТО: zh_TW.big5

панды: 0.19.1
нос: нет
пункт: 9.0.1
setuptools: 27.2.0
Cython: Нет
число: 1.11.2
scipy: 0.18.1
statsmodels: Нет
xarray: Нет
IPython: 5.1.0
сфинкс: нет
Пэтси: Нет
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
бото: нет
pandas_datareader: Нет

Indexing Missing-data Usage Question

Самый полезный комментарий

не только несколько столбцов, но и один столбец.
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 в моем коде. Это сработало.

не только несколько столбцов, но и один столбец.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
не работай,
но
df.loc[df.id==123, 'num'] = 123
оно работает

почему бы не отредактировать функцию fillna, чтобы адаптировать ее в будущем.
Похоже на ошибку.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги