用引用替换多个列的唯一值



我正在处理一个有多个列的数据框架,我希望找到所选列的唯一值,并将它们替换为另一个列表值。

例如,这是my dataframe

import pandas as pd
data = {'col1': ["Bruce Wayne", "Clark Kent", "Peter Parker"], 
'col2': ["Alfred Pennyworth", "Bruce Wayne", "Clark Kent"]}
df = pd.DataFrame(data=data)
#           col1               col2
# 0   Bruce Wayne  Alfred Pennyworth
# 1    Clark Kent        Bruce Wayne
# 2  Peter Parker         Clark Kent

我有下面的值列表,我想替换我的数据框中的唯一值:

AlternativeNames = ["Batman", "Superman", "Spiderman", "Batman's butler"]

那么输出将是:

col1             col2
0     Batman  Batman's butler
1   Superman           Batman
2  Spiderman        Spiderman

你可以假设顺序无关紧要。所以如果克拉克·肯特被映射成蝙蝠侠,那也没关系。然而,映射的一致性是很重要的,所以如果克拉克·肯特被映射到蝙蝠侠,它必须适用于任何地方。

我知道如何获取多列的唯一值,我知道pd.factorize();然而,在这种情况下,我有一个引用列表,我不确定如何根据引用列表替换值。

您可以使用pandas的分类数据类型:

df = df.stack().astype('category')
df.cat.categories = ["Batman", "Superman", "Spiderman", "Batman's butler"]
df = df.unstack()
col1       col2
0         Superman     Batman
1        Spiderman   Superman
2  Batman's butler  Spiderman

或者,更短但更难读:

alt = ["Batman", "Superman", "Spiderman", "Batman's butler"]
df.replace(dict(zip(df.stack().astype('category').cat.categories, alt)))
col1       col2
0         Superman     Batman
1        Spiderman   Superman
2  Batman's butler  Spiderman

由于映射无关紧要,我们可以使用np.unique从多个列中获取唯一值,zipAlternativeNames一起创建映射器,然后DataFrame.replace应用映射:

AlternativeNames = ["Batman", "Superman", "Spiderman", "Batman's butler"]
mapper = dict(zip(np.unique(df[['col1', 'col2']]), AlternativeNames))
df = df.replace(mapper)

df:

col1       col2
0         Superman     Batman
1        Spiderman   Superman
2  Batman's butler  Spiderman

mapper:

{
'Alfred Pennyworth': 'Batman',
'Bruce Wayne': 'Superman',
'Clark Kent': 'Spiderman',
'Peter Parker': "Batman's butler"
}

DataFrame and imports:

import numpy as np
import pandas as pd
data = {'col1': ["Bruce Wayne", "Clark Kent", "Peter Parker"],
'col2': ["Alfred Pennyworth", "Bruce Wayne", "Clark Kent"]}
df = pd.DataFrame(data=data)

最新更新