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

Pandas 替换熊猫中的名称时忽略NaN值,pandas,replace,nan,Pandas,Replace,Nan,我试图替换数据集中某列上的某些值 *(注意NaN条目的存在) 列:名称 值: OLIVER HARRY OLIVER NaN HARRY NaN User1 User2 User1 User0 User2 User0 User1 User2 User1 NaN User2 NaN 通过执行以下操作: df['Name'] = 'User' + pd.Series(pd.factorize(df['Name'])[0] + 1).astype(str) 我得到了我想要的东西: 值: O

我试图替换数据集中某列上的某些值

*(注意NaN条目的存在)

名称

OLIVER 
HARRY 
OLIVER
NaN
HARRY
NaN
User1
User2
User1
User0
User2
User0
User1
User2
User1
NaN
User2
NaN
通过执行以下操作:

df['Name'] = 'User' + pd.Series(pd.factorize(df['Name'])[0] + 1).astype(str)
我得到了我想要的东西:

OLIVER 
HARRY 
OLIVER
NaN
HARRY
NaN
User1
User2
User1
User0
User2
User0
User1
User2
User1
NaN
User2
NaN
问题是我需要我的NaN值保持为NaN。处理过程应忽略NaN列值,并将其保持不变,如下所示:

OLIVER 
HARRY 
OLIVER
NaN
HARRY
NaN
User1
User2
User1
User0
User2
User0
User1
User2
User1
NaN
User2
NaN
怎么做呢?

怎么样

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
,则使用数组中的值作为第三个参数。

如何

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
,而数组中的值则作为第三个参数给出。

另一种方法是从
Name
列中创建一个dict并映射它:

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

另一种方法是从
名称
列创建一个dict并映射它:

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

@mortysporty,谢谢分享好的解决方案,请在这里添加解释。@mortysporty,谢谢分享好的解决方案,请在这里添加解释。