在熊猫中替换名称时忽略NaN值

时间:2019-03-02 13:02:16

标签: pandas replace nan

我正在尝试替换数据集中某列上的某些值。

*(请注意存在NaN条目)

Name

OLIVER 
HARRY 
OLIVER
NaN
HARRY
NaN

通过执行以下操作:

df['Name'] = 'User' + pd.Series(pd.factorize(df['Name'])[0] + 1).astype(str)

我基本上得到了我想要的东西:

User1
User2
User1
User0
User2
User0

问题是我需要我的 NaN 值保持为 NaN 。处理过程应忽略 NaN 列值,并保持原样,得到如下内容:

User1
User2
User1
NaN
User2
NaN

这怎么办?

2 个答案:

答案 0 :(得分:3)

怎么样

import numpy as np

df['Name'] = np.where(df['Name'].isna(), df['Name'],'User' + pd.Series(pd.factorize(df['Name'])[0] + 1).astype(str))

这不会代替nan条目,而只是保留它们。

基本上,where函数采用布尔值数组(在本例中为df['Name'].isna()),并使用该数组中的值作为第二个参数,无论该值的结果为True,并且否则将其作为第三个参数。

答案 1 :(得分:1)

另一种方法是从您的Name列中创建一个字典并将其映射:

names = {n:"User{}".format(i) for i, n in enumerate(df["Name"].unique())}
df["Name"] = df["Name"].map(names)