使用映射字典替换多个字符
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)
我正在 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)