我对python很陌生,这可能是一个基本问题。如果是这样,请提前对不起!
我正在尝试完成以下任务:
df3['court_short']
中搜索court_region_df[['court_long']]
的值。 court_region_df[['court_long']]
中存在匹配项,则为court_region_df[['hmcts_region']]
选择该行的值并将其复制到df3['region']
df3['court_short']
的值是一个字符串,通常是一个类似城镇名称的名称,而court_region_df[['court_long']]
的值则是一个较长的字符串的值,例如完整的地址。
我对首先如何完成步骤1感到迷茫。我发现的大多数python搜索功能似乎都不适合在较长的字符串中查找特定模式。
答案 0 :(得分:1)
这是一个玩具示例,但与您的示例大致相同:
d = pd.DataFrame([['aa', 'bb'], ['cc', 'dd']], columns=['a', 'b'])
e = pd.DataFrame([['a', 'E'], ['c', '.']], columns=['a', 'b'])
e['c'] = e['a'].apply(lambda x: (d[d['a'].str.contains(x)]['b']))[0]
输出:
a b c
0 a E bb
1 c . NaN
编辑:我尝试使用您的数据,并且能够提出一种非矢量化的解决方案,该解决方案速度稍慢,但可管理(与您共享的文件需要花费几秒钟的时间)。在这里:
court_region_df = pd.read_csv('courts (1).csv')
df3 = pd.read_csv('cjs-national-court-codes-9 (2).csv', names=['court_short'], header=0)
court_region_df = court_region_df.rename(columns={'court':'court_long'})
for idx in df3.index:
x = df3.loc[idx,'court_short']
region = court_region_df[court_region_df.iloc[:,0].str.contains(x, case=False, regex=False)]['hmcts_region']
df3.loc[idx, 'region'] = [region.values[0] if len(region) > 0 else np.nan][0]
稍微快一点的是将它们存放在字典中,并且完全避免使用熊猫魔法:
court_to_region = pd.Series(court_region_df.hmcts_region.values, index=court_region_df.court_long.str.lower()).to_dict()
regions = []
for i in df3.court_short.values:
region = np.nan
for key in court_to_region.keys():
if i.lower() in key:
region = court_to_region[key]
regions.append(region)
df3['region'] = regions
结果:
df3[~df3.isna().any(axis=1)]
court_short region
280 Birmingham Crown Court midlands
301 Ipswich Crown Court south_east
如您所见,给定共享的数据,这仅返回两个匹配项。您可能需要研究模糊的匹配系统。