2014-02-02 5 views
0

если df['col']='a','b','c' и df2['col']='a123','b456','d789' как создать df2['is_contained']='a','b','no_match' где, если значения из df['col'] находятся в пределах значений от df2['col'] значение df['col'] возвращается, и если совпадение не найдено, «no_match» возвращается? Также я не ожидаю, что будет несколько совпадений, но в маловероятном случае я хочу вернуть строку типа «Несколько совпадений».Проверьте столбец Панды содержит значение из другого столбца

+0

Что вы имеете в виду под "нескольких матчей"? Вы имеете в виду два '' a '' '' a123a '', или вы имеете в виду в разных строках df2 ['col'], например. '[ 'A123', 'b456', 'a789'] '? – DSM

+0

Последний случай, когда разные строки сопоставляются – ChrisArmstrong

ответ

0

С помощью этого набора игрушек данных, мы хотим, чтобы добавить новый столбец df2, который будет содержать no_match в течение первых трех строк, а последняя строка будет содержать значение 'd' из-за того, что col значения этой строки (в письме 'a') появляется в df1.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 


df1 = pd.DataFrame({'col': ['a', 'b', 'c', 'd']}) 
df2 = pd.DataFrame({'col': ['a123','b456','d789', 'a']}) 

Другими словами, значения из df1 следует использовать для заполнения этого нового столбца в df2 только тогда, когда значение подряд в df2['col'] появляется где-то в df1['col'].

In [2]: df1 
Out[2]: 
    col 
0 a 
1 b 
2 c 
3 d 

In [3]: df2 
Out[3]: 
    col 
0 a123 
1 b456 
2 d789 
3  a 

Если это правильный путь, чтобы понять ваш вопрос, то вы можете сделать это с пандами isin:

In [4]: df2.col.isin(df1.col) 
Out[4]: 
0 False 
1 False 
2 False 
3  True 
Name: col, dtype: bool 

Это вычисляется True только тогда, когда значение в df2.col также в df1.col.

Тогда вы можете использовать np.where, что более или менее похоже на ifelse в R, если вы знакомы с R вообще.

In [5]:  np.where(df2.col.isin(df1.col), df1.col, 'NO_MATCH') 
Out[5]: 
0 NO_MATCH 
1 NO_MATCH 
2 NO_MATCH 
3   d 
Name: col, dtype: object 

Для строк, где значение df2.col появляется в df1.col, значение из df1.col будет возвращено для данного индекса строки. В случаях, когда значение df2.col не является членом df1.col, используется значение по умолчанию 'NO_MATCH'.

+0

Я действительно хочу, чтобы он соответствовал частичному совпадению. Поэтому в вашем примере каждое значение будет иметь совпадение. Я не думаю, что isin обрабатывает частичное совпадение. – ChrisArmstrong

1

В 0.13, Вы можете использовать str.extract:

In [11]: df1 = pd.DataFrame({'col': ['a', 'b', 'c']}) 

In [12]: df2 = pd.DataFrame({'col': ['d23','b456','a789']}) 

In [13]: df2.col.str.extract('(%s)' % '|'.join(df1.col)) 
Out[13]: 
0 NaN 
1  b 
2  a 
Name: col, dtype: object 
Смежные вопросы