我正在尝试替换数据集中某列上的某些值。
*(请注意存在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
这怎么办?
答案 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)