在Pandas Dataframe中查找字符串模式匹配并返回匹配的字符串

时间:2014-03-28 03:12:49

标签: python pandas

我有一个数据框列,其中包含可变的逗号分隔文本,只是尝试提取基于另一个列表找到的值。所以我的数据框看起来像这样:

col1 | col2
-----------
 x   | a,b


listformatch = [c,d,f,b]
pattern = '|'.join(listformatch)

def test_for_pattern(x):
    if re.search(pattern, x):
        return pattern
    else:
        return x

#also can use col2.str.contains(pattern) for same results

上面的过滤效果很好,但是当它找到匹配时返回b而不返回整个模式,例如a|b而不是b,而我想要创建另一个列它找到的模式,如b

这是我的最终功能,但仍然得到UserWarning: This pattern has match groups. To actually get the groups, use str.extract." groups, use str.extract.", UserWarning)我希望我能解决:

def matching_func(file1, file2):
    file1 = pd.read_csv(fin)
    file2 = pd.read_excel(fin1, 0, skiprows=1)
    pattern = '|'.join(file1[col1].tolist())
    file2['new_col'] = file2[col1].map(lambda x: re.search(pattern, x).group()\
                                             if re.search(pattern, x) else None)

我想我了解熊猫提取物现在如何起作用,但可能仍然在正则表达式上生锈。如何创建用于以下示例的模式变量:

df[col1].str.extract('(word1|word2)')

我想创建变量pattern = 'word1|word2'而不是参数中的单词,但是由于字符串的创建方式,它不会起作用。

我在pandas 0.13中使用矢量化字符串方法的最终和首选版本:

使用一列中的值从第二列中提取:

df[col1].str.extract('({})'.format('|'.join(df[col2]))

1 个答案:

答案 0 :(得分:1)

您可能希望使用提取或其他vectorised string methods之一:

In [11]: s = pd.Series(['a', 'a,b'])

In [12]: s.str.extract('([cdfb])')
Out[12]:
0    NaN
1      b
dtype: object