pandas 使用具有部分字符串匹配的字典创建数据框的新列

jjhzyzn0  于 2023-05-12  发布在  其他
关注(0)|答案(3)|浏览(101)

我是新的编码和任何帮助将不胜感激。
函数应该接受一个pandas数据框作为输入。使用下面给出的has_Dict字典从tweet中提取城市,并将结果插入到同一 Dataframe 中名为“City”的新列中。如果找不到城市,则使用条目np.nan。
当字典和df有相同数量的条目时,我的代码可以工作,但只要我向df添加一个条目,我就会得到“IndexError:列表索引超出范围”。我需要它工作的df与更多的条目比字典。(数据集实际上更大,我在这里创建了一个较小的示例)。

import pandas as pd
details = {'Tweets':['Whatever #JHB', 'Yes #CPT']}
df = pd.DataFrame(details)
print(df)
          Tweets
0  Whatever #JHB
1       Yes #CPT

hasDict = {'#JHB':'JHB','#CPT':'CPT'}

df['City'] = df['Tweets'].apply(lambda x : [hasDict[city] for city 
in hasDict if city in x][0]).fillna(np.nan)

Output
            Tweets  City
0   Whatever #JHB   JHB
1       Yes #CPT    CPT

但当df较大时:

details = {'Tweets':['Whatever #JHB', 'Yes #CPT', 'Hello #PE']}

我明白

IndexError: list index out of range

下面的似乎工作,但我试图找出正则表达式的一部分,它是正则表达式后的str。提取?我总是需要导入正则表达式吗?(除了pandas和numpy,我不应该导入任何东西)。

df['City'] = df['Tweets'].str.extract('('+'|'.join(hasDict.keys())+')', expand=False).map(hasDict).fillna(np.nan)
oogrdqng

oogrdqng1#

只要城市总是以#开始,你实际上不需要字典Map,因为你可以使用正则表达式:

import re
df["City"] = df["Tweets"].apply(lambda x: re.search("([^#]+)$", x).group(1))
laximzn5

laximzn52#

这是我如何实现你的代码,它的工作原理(我附上了一张图片到这个答案):

import pandas as pd
import numpy as np
details = {'Tweets':['Whatever #JHB', 'Yes #CPT']}
df = pd.DataFrame(details)
hasDict = {'#JHB':'JHB','#CPT':'CPT'}
def find_city(tweet):
  cities = hasDict.keys()
  for city in cities:
    if city in tweet:
      return hasDict[city]
  return np.nan
df['City'] = df['Tweets'].apply(lambda x : find_city(x))
print(df.head(5))

下面是我运行这段代码时的终端图像和我得到的输出:

希望对你有帮助。

6ju8rftf

6ju8rftf3#

你可以在explode(tokenize)你的dataframe之后使用map

df['City'] = df['Tweets'].str.findall(r"(#\w+)").explode().map(hasDict)
print(df)

# Output
          Tweets City
0  Whatever #JHB  JHB
1       Yes #CPT  CPT
2      Hello #PE  NaN

关于regex:

(        <- start of capture group (what I want in the output)
  #      <- hashtag
    \w+  <- any characters a-z A-Z 0-9 _
)        <- end of capture group

你不需要导入re模块,Pandas已经为它的字符串方法做了。

相关问题