Как найти строку в одном столбце данных pandas как подстроку в другом столбце данных - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть два кадра данных панд df1 и df2.Мне нужно создать новый столбец в df1, выполнив поиск df2['B'], чтобы увидеть, является ли df1['A'] подстрокой df2['B'].Если есть совпадение, верните значение df2['A'] для нового столбца в df1['B'].

Ниже приведены образцы данных

df1

      A                  B           
9.female.ceo.,ceo,       ?
9.female.ned.,ned,
9.female.ned.,chair,
2.female.ed.,ned,
2.female.ned.,ed,
9.female.chair.,ceo,
2.female.chair.,chair,

df2

     A                B
,ceo,ned,          2.male.chair.,ceo,ned,
,chair,ned,        2.male.ned.,chair,ned,  
,ned,              2.female.ed.,ned,
,ceo,chair,        6.female.ed.,ceo,chair,
,ed,ceo,           6.male.chair.,ed,ceo,
,ceo,chair,        9.female.ed.,ceo,chair,
,ceo,ned,          9.female.chair.,ceo,ned,
,chair,(in ft10),  9.male.ceo.,chair,(in ft10),

Слияние не будет работать в этом случае, поскольку df1['A'] содержит подстроку df2['B']

Любая помощь, которая указывает в правильном направлении, будет очень цениться.

Ожидаемые результаты

df1

      A                    B           
9.female.ceo.,ceo,       
9.female.ned.,ned,
9.female.ned.,chair,
2.female.ed.,ned,         ,ned,
2.female.ned.,ed,
9.female.chair.,ceo,      ,ceo,ned,
2.female.chair.,chair,  

1 Ответ

0 голосов
/ 24 февраля 2019

Идея заключается в создании наборов путем деления на , и сопоставления по issubset:

d = {k: set(v.split(',')) for k, v in df2.set_index('A')['B'].items()}
df1['B'] = [next(iter([k for k, v in d.items() if set(x.split(',')).issubset(v)]), '') 
                      for x in df1['A']]
print (df1)
                        A          B
0      9.female.ceo.,ceo,           
1      9.female.ned.,ned,           
2    9.female.ned.,chair,           
3       2.female.ed.,ned,      ,ned,
4       2.female.ned.,ed,           
5    9.female.chair.,ceo,  ,ceo,ned,
6  2.female.chair.,chair,           

Решение с тестом по in:

d = df2.set_index('A')['B']
df1['B'] = [next(iter([k for k, v in d.items() if x in v]), '')  for x in df1['A']]
print (df1)
                        A          B
0      9.female.ceo.,ceo,           
1      9.female.ned.,ned,           
2    9.female.ned.,chair,           
3       2.female.ed.,ned,      ,ned,
4       2.female.ned.,ed,           
5    9.female.chair.,ceo,  ,ceo,ned,
6  2.female.chair.,chair,           

Другое решение с кроссобъединить merge с тестовыми подстроками in:

df3 = df1.assign(tmp=1).merge(df2.assign(tmp=1), on='tmp', suffixes=('','_'))
df3 = df3.loc[[a in b for a, b in zip(df3['A'], df3['B_'])], ['A','A_']]

df = df1[['A']].merge(df3.rename(columns={'A_':'B'}), on='A', how='left')
print (df)
                        A          B
0      9.female.ceo.,ceo,        NaN
1      9.female.ned.,ned,        NaN
2    9.female.ned.,chair,        NaN
3       2.female.ed.,ned,      ,ned,
4       2.female.ned.,ed,        NaN
5    9.female.chair.,ceo,  ,ceo,ned,
6  2.female.chair.,chair,        NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...