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

问题描述 投票:0回答:3

我是编码新手,如有任何帮助,我们将不胜感激。

函数应将 pandas 数据框作为输入。 使用下面给出的 has_Dict 字典从推文中提取城市,并将结果插入到同一数据框中名为“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

以下似乎可行,但我正在尝试找出正则表达式部分 我总是需要导入正则表达式吗? (除了 pandas 和 numpy 之外,我不应该为作业导入任何东西)。

df['City'] = df['Tweets'].str.extract('('+'|'.join(hasDict.keys())+')', expand=False).map(hasDict).fillna(np.nan)
pandas dataframe dictionary lambda key-value
3个回答
0
投票

只要城市始终以

#
开头,您实际上并不需要字典映射,因为您可以使用正则表达式:

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

0
投票

您可以在

map
(标记化)您的数据框后使用
explode

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

0
投票

这就是我实现你的代码的方式,它是有效的(我在这个答案上附上了一张图片):

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))

这是我运行这段代码时终端的图像和我得到的输出: 我希望它有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.