Для каждого значения в серии возвращают значение из другого ряда панд, если значения серии1 являются подстрокой в ​​серии2 - PullRequest
0 голосов
/ 20 октября 2018

В приведенном ниже примере я пытаюсь создать новый столбец df1['new'].Я хочу посмотреть значения df1['city'] и посмотреть, являются ли они подстрокой какой-либо из строк в df2['des'].Если это так, я хочу, чтобы df1['new'] имел значения df2['des']: (в данном примере описание города).

df1['city']:

    city
0   New York
1   Amsterdam
2   London
3   Karachi

df2['des']:

    des
0   London is the capital and ...
1   Amsterdam and New York are two...
2   Karachi is the capital of...

Это то, что я хочу

        city                                  new
0   New York    Amsterdam and New York are two...
1  Amsterdam    Amsterdam and New York are two...
2     London        London is the capital and ...
3    Karachi         Karachi is the capital of...

На данный момент самое близкое, что мне удалось решить, это:

df['new'] = df.loc[df.des.str.contains("London"), 'des']

Чтовыходные данные:

    city            new
0   New York        NaN
1  Amsterdam        NaN
2     London        London is the capital and ...
3    Karachi        NaN

Я хочу вместо того, чтобы просто передать "London" в условном выражении, передать всю серию df1['city'].Если я сделаю это, я получу эту ошибку: TypeError: 'Series' objects are mutable, thus they cannot be hashed

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Другое решение, использующее понимание списка:

df1['new'] = [next((i for i in df2['des'] if x in i), 'Not found!') for x in df1['city']]

И другое, использующее regex и str.extractall:

matches = df2['des'].str.extractall('({})'.format('|'.join(df1['city']))).reset_index(0)
m = matches.set_index(0)['level_0'].map(df2['des'])
df1['new'] = df1['city'].map(m).fillna('No match!')
0 голосов
/ 20 октября 2018

Давайте предположим, что вы просто хотите одно совпадение, в случае, если есть повторяющиеся совпадения.В противном случае любое решение будет более сложным.

С этими проблемами вместо итерации строк часто лучше итерировать ваши города и использовать pd.Series.str.contains.Например, вы можете создать словарь:

d = {city: df2.loc[df2['des'].str.contains(city, regex=False), 'des'].iat[0] \
     for city in df1['city']}

Затем сопоставьте с df1 через pd.Series.map:

df1['des'] = df1['city'].map(d).fillna('No match found!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...