使用字典替换熊猫列中字符串中的字符串

oww*_*w14 3 python dictionary replace dataframe pandas

我试图用一个dictionary key来代替stringspandas其列values。但是,每一列都包含句子。因此,我必须首先标记这些句子,并检测该句子中的单词是否与我的词典中的键相对应,然后将字符串替换为相应的值。

但是,结果我仍然一无所获。有没有更好的pythonic方法来解决此问题?

这是我目前的MVC。在评论中,我指定了问题发生的位置。

import pandas as pd

data = {'Categories': ['animal','plant','object'],
    'Type': ['tree','dog','rock'],
        'Comment': ['The NYC tree is very big','The cat from the UK is small','The rock was found in LA.']
}

ids = {'Id':['NYC','LA','UK'],
      'City':['New York City','Los Angeles','United Kingdom']}


df = pd.DataFrame(data)
ids = pd.DataFrame(ids)

def col2dict(ids):
    data = ids[['Id', 'City']]
    idDict = data.set_index('Id').to_dict()['City']
    return idDict

def replaceIds(data,idDict):
    ids = idDict.keys()
    types = idDict.values()
    data['commentTest'] = data['Comment']
    words = data['commentTest'].apply(lambda x: x.split())
    for (i,word) in enumerate(words):
        #Here we can see that the words appear
        print word
        print ids
        if word in ids:
        #Here we can see that they are not being recognized. What happened?
            print ids
            print word
            words[i] = idDict[word]
            data['commentTest'] = ' '.apply(lambda x: ''.join(x))
    return data

idDict = col2dict(ids)
results = replaceIds(df, idDict)
Run Code Online (Sandbox Code Playgroud)

结果:

None
Run Code Online (Sandbox Code Playgroud)

我正在使用python2.7,当我打印出时dict,有u'Unicode。

我的预期结果是:

分类目录

评论

类型

commentTest

  Categories  Comment  Type commentTest
0 animal  The NYC tree is very big tree The New York City tree is very big 
1 plant The cat from the UK is small dog  The cat from the United Kingdom is small 
2 object  The rock was found in LA. rock  The rock was found in Los Angeles. 
Run Code Online (Sandbox Code Playgroud)

tdy*_*tdy 14

尽管需要循环,但实际上它的使用速度str.replace()比快得多:replace()str.replace()

ids = {'NYC': 'New York City', 'LA': 'Los Angeles', 'UK': 'United Kingdom'}

for old, new in ids.items():
    df['Comment'] = df['Comment'].str.replace(old, new, regex=False)

#   Categories  Type                                   Comment
# 0     animal  tree        The New York City tree is very big
# 1      plant   dog  The cat from the United Kingdom is small
# 2     object  rock         The rock was found in Los Angeles
Run Code Online (Sandbox Code Playgroud)

唯一一次replace()优于str.replace()循环的情况是使用小数据帧:

str.replace 与替换的时间

参考计时函数:

def Series_replace(df):
    df['Comment'] = df['Comment'].replace(ids, regex=True)
    return df

def Series_str_replace(df):
    for old, new in ids.items():
        df['Comment'] = df['Comment'].str.replace(old, new, regex=False)
    return df
Run Code Online (Sandbox Code Playgroud)

请注意,如果ids是数据帧而不是字典,则可以使用以下方法获得相同的性能itertuples()

ids = pd.DataFrame({'Id': ['NYC', 'LA', 'UK'], 'City': ['New York City', 'Los Angeles', 'United Kingdom']})

for row in ids.itertuples():
    df['Comment'] = df['Comment'].str.replace(row.Id, row.City, regex=False)
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 6

您可以创建dictionary然后replace

ids = {'Id':['NYC','LA','UK'],
      'City':['New York City','Los Angeles','United Kingdom']}

ids = dict(zip(ids['Id'], ids['City']))
print (ids)
{'UK': 'United Kingdom', 'LA': 'Los Angeles', 'NYC': 'New York City'}

df['commentTest'] = df['Comment'].replace(ids, regex=True)
print (df)
  Categories                       Comment  Type  \
0     animal      The NYC tree is very big  tree   
1      plant  The cat from the UK is small   dog   
2     object     The rock was found in LA.  rock   

                                commentTest  
0        The New York City tree is very big  
1  The cat from the United Kingdom is small  
2        The rock was found in Los Angeles.  
Run Code Online (Sandbox Code Playgroud)

  • @pceccon - 我认为在文档中应该注意它更常用于替换子字符串,现在文档中完全不清楚。 (2认同)