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 выбран только один столбец, он ведет себя правильно.
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()
коммит: Нет
питон: 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: Нет
вы заполняете копию. Использование 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, чтобы адаптировать ее в будущем.
Похоже на ошибку.
Самый полезный комментарий
не только несколько столбцов, но и один столбец.
df.loc[df.id==123, 'num'].fillna(0, inplace=True)
не работай,
но
df.loc[df.id==123, 'num'] = 123
оно работает
почему бы не отредактировать функцию fillna, чтобы адаптировать ее в будущем.
Похоже на ошибку.