Для каждого значения столбца [substring] найдите соответствие в другом столбце [string] - PullRequest
0 голосов
/ 18 декабря 2018

Я довольно новичок в python, это может быть основным вопросом.Если это так, заранее извините!

Я пытаюсь выполнить следующее:

  1. Для каждой строки найдите значение df3['court_short'] в столбце court_region_df[['court_long']].
  2. Если в столбце court_region_df[['court_long']] есть совпадение, выберите значение этой строки для court_region_df[['hmcts_region']] и скопируйте его в df3['region']

Значение, которое принимает df3['court_short']:строка, обычно это название города, например, court_region_df[['court_long']] принимает значение более длинной строки, например полный адрес.

Сначала я немного заблудился о том, как выполнить шаг 1. Большинство изКажется, что найденные мной функции поиска в python не подходят для поиска определенного шаблона в более длинной строке.

1 Ответ

0 голосов
/ 18 декабря 2018

Это игрушечный пример, но он примерно такой же, как ваш:

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

Как вы можете видеть, учитывая данные, которыми вы поделились, это возвращает только два совпадения.Возможно, вы захотите взглянуть на нечеткую систему сопоставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...