2015-01-15 18 views
39

Giả sử chúng ta có một khung dữ liệu trong Python Pandas trông như thế này:Làm thế nào để lọc các hàng có chứa một mô hình chuỗi từ một dataframe Pandas

df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']}) 

Hoặc, ở dạng bảng:

ids vals 
aball 1 
bball 2 
cnut 3 
fball 4 

thế nào cách nào để lọc các hàng có chứa từ khóa "ball?" Ví dụ, sản lượng nên là:

ids vals 
aball 1 
bball 2 
fball 4 
+2

Bạn nên chấp nhận một trong 5 câu trả lời đã được đăng, sẽ có dấu chọn bên dưới nút biểu quyết, lưu ý rằng câu trả lời 'str.contains' có lẽ là phương pháp nhanh nhất và được đề xuất cho các yêu cầu của bạn: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.strings.StringMethods.contains.html#pandas.core.strings.StringMethods.contains – EdChum

Trả lời

83
In [3]: df[df['ids'].str.contains("ball")] 
Out[3]: 
    ids vals 
0 aball  1 
1 bball  2 
3 fball  4 
+0

Hi Amit, Cảm ơn rất nhiều, hoạt động hoàn hảo! –

+0

@JohnKnight - Bạn được chào đón! – Amit

+1

Làm cách nào bạn đảo ngược điều này để tìm tất cả các hàng không chứa chuỗi? – user4896331

7
>>> mask = df['ids'].str.contains('ball')  
>>> mask 
0  True 
1  True 
2 False 
3  True 
Name: ids, dtype: bool 

>>> df[mask] 
    ids vals 
0 aball  1 
1 bball  2 
3 fball  4 
31
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1 

Step-by-step lời giải thích (từ bên trong để bên ngoài):

  • df['ids'] chọn ids cột của khung dữ liệu (techincally, đối tượng df[ids] là loại pandas.Series)
  • df['ids'].str cho phép chúng ta áp dụng phương pháp chuỗi vectorized (ví dụ, lower, contains) về loạt
  • df['ids'].str.contains('ball') kiểm tra mỗi yếu tố của Series là liệu giá trị phần tử có chuỗi 'bóng' như một chuỗi con. Kết quả là một loạt các Booleans chỉ ra True hoặc False về sự tồn tại của chuỗi con 'bóng'.
  • df[df['ids'].str.contains('ball')] áp dụng mặt nạ Boolean 'vào khung dữ liệu và trả về chế độ xem chứa các bản ghi phù hợp.
  • na = False xóa các giá trị NA/NaN; nếu không một ValueError có thể được trả về.
+0

Bạn có thể giải thích mã đó đang hoạt động không và cách thức hoạt động của mã, vui lòng? – Kevin

+0

Làm thế nào để làm việc với một phần phù hợp và lấy chuỗi còn lại với một phần phù hợp ''#': str' một cái gì đó như thế này? –

+2

Hoàn toàn thích nó khi ai đó làm một lời giải thích từng bước. Nó thực sự giúp với hiểu! – user4896331

1

Nếu bạn muốn đặt cột bạn lọc làm chỉ mục mới, bạn cũng có thể xem xét sử dụng .filter; nếu bạn muốn giữ nó như một cột riêng biệt thì str.contains là cách để đi.

Hãy nói rằng bạn có

df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']}) 

     ids vals 
0 aball  1 
1 bball  2 
2  cnut  3 
3 fball  4 
4 ballxyz  5 

và kế hoạch của bạn là để lọc tất cả các hàng trong đó ids chứa ball VÀ thiết ids như chỉ số mới, bạn có thể làm

df.set_index('ids').filter(like='ball', axis=0) 

mang đến cho

  vals 
ids   
aball  1 
bball  2 
fball  4 
ballxyz  5 

Nhưng filter cũng cho phép bạn vượt qua một regex, vì vậy bạn cũng có thể lọc chỉ những hàng mà mục nhập cột kết thúc bằng ball. Trong trường hợp này bạn sử dụng

df.set_index('ids').filter(regex='ball$', axis=0) 

     vals 
ids   
aball  1 
bball  2 
fball  4 

Lưu ý rằng tại mục với ballxyz không được bao gồm khi nó bắt đầu với ball và không kết thúc với nó.

Nếu bạn muốn để có được tất cả các mục bắt đầu bằng ball bạn có thể sử dụng đơn giản

df.set_index('ids').filter(regex='^ball', axis=0) 

năng suất

  vals 
ids   
ballxyz  5 

Các công trình cùng với các cột; tất cả những gì bạn cần thay đổi là phần axis=0. Nếu bạn lọc dựa trên các cột, nó sẽ là axis=1.

Các vấn đề liên quan