我正在处理一个有多个列的数据框架,我希望找到所选列的唯一值,并将它们替换为另一个列表值。
例如,这是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
从多个列中获取唯一值,zip
与AlternativeNames
一起创建映射器,然后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)