使用映射字典替换多个字符

Replacing multiple characters using a mapping dictionary

我正在 harmonizing/cleaning Pandas 中的一个相当“脏”的数据集上工作。为了便于演示,我们假设是这个:

df = pd.DataFrame({"colname": ["ÀÁÂÃÄÅÆ", "Ç", "ÈÉÊË", "ÌÍÎÏ", "Ð", "Ñ", "ÒÓÔÕÖ", "×", "Ø", "ÙÚÛÜ", "Ý", "Þ", "ß"]})

print(df)

    colname
0   ÀÁÂÃÄÅÆ
1         Ç
2      ÈÉÊË
3      ÌÍÎÏ
4         Ð
5         Ñ
6     ÒÓÔÕÖ
7         ×
8         Ø
9      ÙÚÛÜ
10        Ý
11        Þ
12        ß

我的目标是通过对字符应用以下映射来清理上面的列:

Before: ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß
After:  AAAAAAACEEEEIIIIDNOOOOO OUUUUY S

虽然链接 32 str.replace() 应该可以完成这项工作,但对我来说它似乎不是一个特别可读的解决方案。例如,对于前两个:

df["colname"] = df["colname"].str.replace("À", "A").str.replace("Á", "A")

相反,我想知道是否可以定义以下映射字典

sub_dict = {
    "À": "A", "Á": "A", "Â": "A", "Ã": "A", "Ä": "A", "Å": "A", "Æ": "A", "Ç": "C", 
    "È": "E", "É": "E", "Ê": "E", "Ë": "E", "Ì": "I", "Í": "I", "Î": "I", "Ï": "I",
    "Ð": "D", "Ñ": "N", "Ò": "O", "Ó": "O", "Ô": "O", "Õ": "O", "Ö": "O", "×": " ",
    "Ø": "O", "Ù": "U", "Ú": "U", "Û": "U", "Ü": "U", "Ý": "Y", "Þ": " ", "ß": "S"
}

并将该映射应用于 DataFrame 的列?

清理后的输出 DataFrame 应如下所示:

    colname
0   AAAAAAA
1         C
2      EEEE
3      IIII
4         D
5         N
6     OOOOO
7          
8         O
9      UUUU
10        Y
11         
12        S

您可以将字符串转换为字符列表,分解列表,并对每个字符应用映射 sub_dict,然后再次对字符进行分组:

df_out = (
    df['colname']
    .apply(list)
    .explode()
    .map(sub_dict)
    .groupby(level=0)
    .apply(lambda x : ''.join(x))
)

它给你你想要的输出:

    colname
0   AAAAAAA
1   C
2   EEEE
3   IIII
4   D
5   N
6   OOOOO
7   
8   O
9   UUUU
10  Y
11  
12         # Check your mapping for "ß", which currently maps to " " instead of "S"

是的,你绝对可以做到!请记住,内置 replace() 和 pandas Series.replace() 之间存在重要差异。后者允许传递字典并一次执行多个替换。总之,我建议在你的词典中使用 pandas Series.replace()

df["colname"] = df["colname"].replace(sub_dict,regex=True)