2015-09-01 64 views
1

我有一個有兩列字符串的熊貓數據框。我想識別第一列(s1)中字符串出現在第二列(s2)字符串中的所有行。使用正則表達式在熊貓中查找另一列中的值

所以,如果我的專欄是:

abc abcd*ef_gh 
z1y xxyyzz 

我想保持第一行,而不是第二。

我能想到的唯一辦法是:

  1. 迭代通過數據幀行
  2. 使用s1內容作爲匹配模式

適用df.str.contains()s2有什麼辦法要做到這一點,不需要遍歷行?

+1

我不認爲你可以在這個時候以矢量化的方式做到這一點 – EdChum

+1

@EdChum,不完全可以使用'numpy.char.find()'進行簡單的匹配,如果沒有're'參與其中。 –

+0

如果你有一個非常大的數據集,你可以看看[Dask](http://dask.pydata.org/en/latest/)。 –

回答

1

我能想出的最好的方法是使用apply代替手工迭代:

>> df = pd.DataFrame({'x': ['abc', 'xyz'], 'y': ['1234', '12xyz34']}) 
>> df 
    x  y 
0 abc  1234 
1 xyz 12xyz34 

>> df.x[df.apply(lambda row: row.y.find(row.x) != -1, axis=1)] 
1 xyz 
Name: x, dtype: object 
+0

對不起,打破這個給你,但'應用'本質上是'for'循環,代碼只是看起來更清潔 – EdChum

+0

@EdChum感謝您的確認。儘管如此,[Dask](http://dask.pydata.org/en/latest/)可能會並行。 –

+0

這可能是正確的,因爲操作彼此獨立,因此任務可以分區 – EdChum

2

這可能是可行的(僅適用於簡單的匹配),在向量化的方式,與numpy的chararray methods

In [326]: 

print df 
    s1   s2 
0 abc abcd*ef_gh 
1 z1y  xxyyzz 
2 aaa aaabbbsss 
In [327]: 

print df.ix[np.char.find(df.s2.values.astype(str), 
         df.s1.values.astype(str))>=0, 
      's1'] 
0 abc 
2 aaa 
Name: s1, dtype: object