对于每个列值[substring],在另一列[string]中查找匹配项

2024-10-02 18:19:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python比较陌生,这可能是一个基本问题。如果是这样,请提前道歉!在

我正在努力完成以下任务:

  1. 对于每一行,在court_region_df[['court_long']]列中搜索df3['court_short']的值。在
  2. 如果列court_region_df[['court_long']]中有匹配项,则为court_region_df[['hmcts_region']]选择该行的值并将其复制到df3['region']

df3['court_short']接受的值是一个字符串,通常是一个类似的城镇名称,而court_region_df[['court_long']]则采用较长字符串的值,例如完整地址。在

我对如何完成第一步有点迷茫。我发现的大多数python搜索函数似乎不适合在较长的字符串中查找特定模式。在


Tags: 函数字符串名称df地址模式regionlong
1条回答
网友
1楼 · 发布于 2024-10-02 18:19:27

这是一个玩具的例子,但和你的差不多:

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]

输出:

^{pr2}$

编辑:我尝试了你的数据,并能想出一个非矢量化的解决方案,这是一个有点慢,但可管理的解决方案(使用你共享的文件需要几秒钟的时间)。这里是:

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

如您所见,给定您共享的数据,它只返回两个匹配项。你可能需要研究一个更模糊的匹配系统。在

相关问题 更多 >