Pandas: BUG:具有就地功能的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)

相反,以下代码的行为符合预期。
唯一的区别是通过ilocloc选择

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

安装的版本

提交:无
的Python:3.5.2.final.0
python位:64
操作系统:Linux
操作系统版本: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

最有用的评论

不仅是多列,而且是一列。
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 等级