我是编码新手,如有任何帮助,我们将不胜感激。
函数应将 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)
只要城市始终以
#
开头,您实际上并不需要字典映射,因为您可以使用正则表达式:
import re
df["City"] = df["Tweets"].apply(lambda x: re.search("([^#]+)$", x).group(1))
您可以在
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
这就是我实现你的代码的方式,它是有效的(我在这个答案上附上了一张图片):
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))