Pandas替换某些列的空值

17

我有一个包含许多列的数据框,例如:

df:
name   salary  age   title
John      100   35    eng
Bill      200  NaN    adm
Lena      NaN   28    NaN
Jane      120   45    eng

我想要替换薪资和年龄列中的空值,但不想替换其他列。我知道可以像这样操作:

u = df[['salary', 'age']]
df[['salary', 'age']] = u.fillna(-1)

但这似乎很简洁,因为它涉及复制。有更有效的方法吗?

5个回答

27

16

试试这个:

subset = ['salary', 'age']
df.loc[:, subset] = df.loc[:, subset].fillna(-1)

感谢@piRSquared的回答,这就是我在寻找的最终答案:df.loc[:, ['salary', 'age']].fillna(-1, inplace=True) - breezymri
19
inplace=True不适用于子切片:https://stackoverflow.com/questions/46377263/pandas-fillna-method-does-not-work-inplace - Cheng
6
这种方法不再有效。但是df.loc[:, ['salary', 'age']] = df.loc[:, ['salary', 'age']].fillna(-1)是可行的。 - Francis Smart
1
@FrancisSmart,请看一下你上面Cheng的评论。他指的是同样的事情。 - piRSquared
1
@piRSquared,只是尝试让答案更易于理解。 - Francis Smart

7

外观不太美观,但功能正常:

df.salary.fillna(-1, inplace=True)
df.age.fillna(-1, inplace=True)
df
>>>    name  salary   age title
    0  John   101.0  35.0   eng
    1  Bill   200.0  -1.0   adm
    2  Lena    -1.0  28.0   NaN
    3  Jane   120.0  45.0   eng

1
这是唯一对我有效的方法。谢谢! - Alex

5
我希望fillna()有像drop()一样的子集参数,也许应该向pandas提交请求,但我认为这是最干净的版本。
df[["salary", "age"]] = df[["salary", "age"]].fillna(-1)

2

你可以做:

df = df.assign(
    salary=df.salary.fillna(-1),
    age=df.age.fillna(-1),
)

如果您想将其与其他操作链接在一起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接