首页 > 解决方案 > 如何将出现在DataFrame中的所有特定字符串替换为Python中的另一个字符串

问题描述

我知道这个主题已经讨论了数百次,当然,我尝试了一切似乎都很好,例如

df.replace("x", "y", regex=True)
df.str.replace 

方法也是,但不知何故它不适用于我的 DataFrame。

我有一个如下所示的 DataFrame

To          From             CC               Title          Body
aa@bb   cc@rr; cd@ee    bg@hy; rg@we         jkasdf         jklasdf
er@ty    po@we          oi@we; we@iw         kljasldf        kasdf

我有一些奇怪的邮件地址,例如 /o-exchange\Smith--- 因为我从组织的 Exchange 电子邮件服务器中检索了 Outlook 电子邮件数据。问题是,似乎有些人有几种类型的这种奇怪的地址,所以我想将它们更改为该特定人的唯一电子邮件。

所以我试着像

df = df.replace("weird email", "unique email", regex=True)
and 
df['From'] = df['From'].str.replace("weird address", "unique address", regex=True)

但它毕竟并没有将所有奇怪的地址替换为相同的唯一地址。有没有任何pythonic方法可以将所有特定字符串替换为另一个字符串?

我的 DataFrame 的输入和输出示例如下

输入

        To                          From                            CC                
      abc@we                      weird@ww              long@ww; exchange@ee  
 weird@ww; exadress@ww             long@ww              long@ww; exchange@ww

我检查了特定人拥有的所有各种奇怪的地址,我编码喜欢

df = df.replace('PersonA weird address1', 'Unique addressA')
df = df.replace('PersonA weird address2', 'Unique addressA')

df = df.replace('PersonB weird address1', 'Unique addressB')
df = df.replace('PersonB weird address2', 'Unique addressB')

我想要的输出就像

        To                          From                            CC                
      abc@we                      Unique@C              Unique@A; Unique@B  
 Unique@C; exadress@ww             Unique@A              Unique@A; Unique@B

我列出了奇怪的地址和拥有该地址的特定人。所以我只想将所有内容整合到一个独特的地址中,就像上面一样。

标签: pythonpython-3.xpandasnumpyreplace

解决方案


创建一个字典,其中包含您所拥有的键和所需的值,而不是在每列上使用 map

keys = ["".join(x) for x in it.permutations(["a","b","c","d"],3)]
values = ["".join(x) for x in it.permutations(["e","f","g","h"],3)]
rand_dict = {}
for k in keys:
    rand_dict[k]=random.choice(values)
df = pd.DataFrame()
df["a"] = random.choices(keys,k = 10)
df["b"] = random.choices(keys,k = 10)
df["c"] = random.choices(keys,k = 10)
#till here we created a demo DataFrame

for col in df:
    df[col] = df[col].map(rand_dict).fillna(df[col])


推荐阅读