2013-07-10 17 views
8

Tôi muốn đếm số lần xuất hiện của một số từ nhất định trong một khung dữ liệu. Tôi biết sử dụng "str.contains"Số lần xuất hiện của các từ nhất định trong khung dữ liệu gấu trúc

a = df2[df2['col1'].str.contains("sample")].groupby('col2').size() 
n = a.apply(lambda x: 1).sum() 

Hiện tại tôi đang sử dụng mã ở trên. Có phương pháp nào phù hợp với cụm từ thông dụng và nhận số lần xuất hiện không? Trong trường hợp của tôi, tôi có một khung dữ liệu lớn và tôi muốn khớp khoảng 100 chuỗi.

Trả lời

9

Phương pháp str.contains chấp nhận một biểu thức chính quy:

Definition: df.words.str.contains(self, pat, case=True, flags=0, na=nan) 
Docstring: 
Check whether given pattern is contained in each string in the array 

Parameters 
---------- 
pat : string 
    Character sequence or regular expression 
case : boolean, default True 
    If True, case sensitive 
flags : int, default 0 (no flags) 
    re module flags, e.g. re.IGNORECASE 
na : default NaN, fill value for missing values. 

Ví dụ:

In [11]: df = pd.DataFrame(['hello', 'world'], columns=['words']) 

In [12]: df 
Out[12]: 
    words 
0 hello 
1 world 

In [13]: df.words.str.contains(r'[hw]') 
Out[13]: 
0 True 
1 True 
Name: words, dtype: bool 

In [14]: df.words.str.contains(r'he|wo') 
Out[14]: 
0 True 
1 True 
Name: words, dtype: bool 

Để đếm lần xuất hiện, bạn chỉ có thể tóm tắt Dòng boolean này:

In [15]: df.words.str.contains(r'he|wo').sum() 
Out[15]: 2 

In [16]: df.words.str.contains(r'he').sum() 
Out[16]: 1 
+0

Đây là nhiều neater và có lẽ nhanh hơn, obviating sự cần thiết cho '' get''. –

+0

@Andy Hayden: Cho phép nói rằng tôi muốn đếm 'hello' và 'word' và in '"hello" count = 1', '"word" count = 1'? Tôi có thể làm điều đó trong một dòng mã không? –

+2

Điều gì về 'word_regexs = [r'he ', r'wo']' và sau đó tạo một Series với 'pd.Series ((df.words.str.contains (r) .sum() cho r trong word_regexs), word_regexs, name = 'count') '? –

3

Để đếm tổng số kết quả phù hợp, hãy sử dụng s.str.match(...).str.get(0).count().

Nếu regex của bạn sẽ được phù hợp với nhiều từ độc đáo, được kiểm cá nhân, sử dụng s.str.match(...).str.get(0).groupby(lambda x: x).count()

Nó hoạt động như thế này:

In [12]: s 
Out[12]: 
0 ax 
1 ay 
2 bx 
3 by 
4 bz 
dtype: object 

Phương pháp match chuỗi xử lý biểu thức thông thường ...

In [13]: s.str.match('(b[x-y]+)') 
Out[13]: 
0  [] 
1  [] 
2 (bx,) 
3 (by,) 
4  [] 
dtype: object 

... nhưng kết quả, như đã cho, không thuận tiện lắm. Phương thức chuỗi get lấy các kết quả trùng khớp thành chuỗi và chuyển đổi kết quả trống thành NaN ...

In [14]: s.str.match('(b[x-y]+)').str.get(0) 
Out[14]: 
0 NaN 
1 NaN 
2  bx 
3  by 
4 NaN 
dtype: object 

... không được tính.

In [15]: s.str.match('(b[x-y]+)').str.get(0).count() 
Out[15]: 2 
+0

: Cảm ơn Allan, pr với tôi là không tính số, làm thế nào về kết hợp regex..Andy đã cung cấp một câu trả lời gọn gàng như bạn đã đồng ý .. :) –