Hướng dẫn dùng idxmin python

Notes: This method is the Series version of ndarray.argmin. This method returns the label of the minimum, while ndarray.argmin returns the position. To get the position, use series.values.argmin().

Trong bài này mình sẽ hướng dẫn cách làm việc với văn bản trong Pandas, đây là một kiểu dữ liệu rất phổ biến trong Python nói chung và Pandas nói riêng.

Hướng dẫn dùng idxmin python

Hướng dẫn dùng idxmin python

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong những bài trước, hầu như mình chỉ sử dụng dữ liệu số để ví dụ cho các bài học về Pandas. Tuy nhiên trong thực tế thì bên cạnh dữ liệu số chắc chắn sẽ luôn có dữ liệu văn bản. Trong bài hôm nay chúng ta sẽ cùng tìm hiểu cách thao tác với dữ liệu văn bản trong Pandas nhé.

1. Kiểu dữ liệu văn bản trong Pandas

Giới thiệu về kiểu dữ liệu string

Trong Pandas, ta có thể tạo một Series từ chuỗi đơn giản như sau:

In[1]

import pandas as pd
import numpy as np

f = pd.Series(['Freetuts', 'Học lập trình online'])

print(f)

Out[1]

0                Freetuts
1    Học lập trình online
dtype: object

Ta có thể thấy dtype của Series này được Pandas chỉ định là object, đây chính là kiểu dữ liệu mặc định khi nhận một danh sách mà trong nó tồn tại giá trị không phải là số.

Bài viết này được đăng tại [free tuts .net]

Trước Pandas phiên bản 1.0, khi lưu trữ văn bản trong DataFrame hay Series thì dtype duy nhất mà Pandas cung cấp đó là object. Điều này sẽ gây ra một số bất lợi sau:

  • Dễ lưu trữ lẫn lộn giữa dữ liệu văn bản và các kiểu dữ liệu khác (do object là kiểu dữ liệu chung nên bất kỳ loại dữ liệu nào cũng có thể là object).
  • Vì là kiểu dữ liệu chung chung cho nên rất khó để cụ thể hoá một số phương thức riêng cho kiểu dữ liệu văn bản. Bạn không thể thêm những phương thức liên quan đến văn bản như cắt, in hoa, in thường,... vào object được do nếu sử dụng lên dữ liệu số sẽ gây xung đột.

Từ sau phiên bản 1.0, Pandas đã bổ sung một kiểu dữ liệu dành riêng cho văn bản là StringDtype. Chúng ta có thể chỉ định cho Series trên thành kiểu này bằng 3 cách:

In[2]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))

Out[2]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string

Nếu như bạn áp kiểu string lên danh sách trong đó có các phần tử không phải là văn bản thì chúng sẽ được ép sang chuỗi, chẳng hạn:

In[3]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))

Out[3]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>

Sự khác biệt giữa kiểu string và object

Tất nhiên với việc xuất hiện kiểu dữ liệu riêng dành cho chuỗi và văn bản, mình luôn khuyến khích các bạn sử dụng dtype này để lưu dữ liệu dạng văn bản vì nó sẽ trực quan hơn so với việc dùng object.

Có một số sự khác biệt đáng chú ý giữa kiểu object và string mà bạn cần biết, đầu tiên đó là nếu như không xuất hiện NA trong dãy (giá trị null) thì một số phương thức áp dụng cho cả 2 kiểu (sẽ nói cụ thể bên dưới) sẽ cùng trả về dtype là int64, giả sử ta sẽ đếm xem trong dãy có các phần tử nào chứa ký tự 'e' hay không:

In[4]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))

Out[4]

Phần tử mang giá trị = 'e' (dtype='string'): 
0    0
1    0
2    1
3    1
4    0
5    0
6    0
7    0
dtype: Int64

Phần tử mang giá trị = 'e' (dtype='object'): 
0    0
1    0
2    1
3    1
4    0
5    0
6    0
7    0
dtype: int64

Sự khác biệt sẽ xuất hiện khi trong dãy có chứa NA hoặc là một giá trị khác chuỗi (số, boolean,...), khi đó dtype object sẽ trả về float64 còn string vẫn sẽ là int64:

In[5]

s = pd.Series(['f', 'r', 'e', 'e', 100, 't', 'u', 't', 's', None], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 100, 't', 'u', 't', 's', None], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))

Out[5]

Phần tử mang giá trị = 'e' (dtype='string'): 
0       0
1       0
2       1
3       1
4       0
5       0
6       0
7       0
8       0
9    <NA>
dtype: Int64

Phần tử mang giá trị = 'e' (dtype='object'): 
0    0.0
1    0.0
2    1.0
3    1.0
4    NaN
5    0.0
6    0.0
7    0.0
8    0.0
9    NaN
dtype: float64

Bên cạnh việc trả về kiểu dữ liệu khác, một điều mà ta để ý đó là phần tử số nguyên (giá trị 100) ở Series có dtype string trả về giá trị 0 (do '100' không chứa 'e'), còn với dtype là object thì sẽ trả về là NA. Lý do đơn giản là vì với dtype string thì phần tử này đã được chuyển thành chuỗi, còn phần tử kia vẫn mang giá trị là số nguyên:

In[6]

0                Freetuts
1    Học lập trình online
dtype: object
0

Out[6]

0                Freetuts
1    Học lập trình online
dtype: object
1

Đây là một điểm mà các bạn nên chú ý để tránh nhầm lẫn khi sử dụng dtype string so với object truyền thống.

2. Các phương thức trên kiểu dữ liệu văn bản trong Pandas

Danh sách các phương thức trong Pandas

Để truy cập các phương thức thao tác với dữ liệu văn bản trong Pandas thì ta sẽ truy cập qua thuộc tính str như sau:

In[7]

0                Freetuts
1    Học lập trình online
dtype: object
2

Out[7]

0                Freetuts
1    Học lập trình online
dtype: object
3

Dưới đây là bảng tất cả các phương thức trên chuỗi được hỗ trợ trong Pandas:

Phương thứcMô tảlower()Chuyển đổi các chuỗi trong Series/Index thành chữ in thườngupper()Chuyển đổi các chuỗi trong Series/Index thành chữ in hoalen()Tính độ dài chuỗistrip()Loại bỏ khoảng trắng (whitespace) của chuỗi trong Series/Indexsplit(pattern)Tách chuỗi với tham số pattern (mẫu) truyền vàocat(sep=' ')Nối các phần tử trong Series/Index với dấu ngăn cách là tham số sepget_dummies()Trả về DataFramecontains(pattern)Trả về True nếu phần tử chứa pattern và ngược lạireplace(a,b)Thay giá trị a bằng b trong từng phần tửrepeat(value)Lặp lại từng phần tử với số lần xác địnhcount(pattern)Trả về số lần xuất hiện của pattern trong mỗi phần tửstartswith(pattern)Trả về True nếu phần tử bắt đầu bằng pattern và ngược lạiendswith(pattern)Trả về True nếu phần tử kết thúc bằng pattern và ngược lạifind(pattern)Trả về vị trí đầu tiên của lần xuất hiện pattern đầu tiên trong từng phần tửfindall(pattern)Trả về danh sách tất cả các lần xuất hiện của patternswapcase()Hoán đổi chữ hoa / chữ thườngislower()Trả về True nếu các phần tử đều là chữ thường và ngược lạiisupper()Trả về True nếu các phần tử đều là chữ hoa và ngược lạiisnumeric()Trả về True nếu phần tử là số và ngược lại

Các phương thức split, replace và concat là những phương thức khá quan trọng và có một vài tham số riêng, do đó mình sẽ nói kỹ ở các mục dưới, còn ở đây chúng ta sẽ đến một số ví dụ với các hàm còn lại:

In[8]

0                Freetuts
1    Học lập trình online
dtype: object
4

Out[8]

0                Freetuts
1    Học lập trình online
dtype: object
5

Với phương thức get_dummies thì mục đích chính của phương thức này là trích xuất các biến giả (dummy variables) từ Series hoặc Index:

In[9]

0                Freetuts
1    Học lập trình online
dtype: object
6

Out[9]

0                Freetuts
1    Học lập trình online
dtype: object
7

Ta có thể dùng phương thức này để tìm sự xuất hiện của các phần tử duy nhất ở từng vị trí trong dãy, ví dụ:

In[10]

0                Freetuts
1    Học lập trình online
dtype: object
8

Out[10]

0                Freetuts
1    Học lập trình online
dtype: object
9

Ngoài việc áp dụng với Series, ta có thể sử dụng các phương thức trên với Index trong DataFrame:

In[11]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
0

Out[11]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
1

Indexing và Extracting

Indexing

Bạn có thể dùng ký hiệu [] để index trực tiếp vào chuỗi thông qua thuộc tính str, nếu như index ra bên ngoài chuỗi thì giá trị trả về sẽ là NA:

In[12]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
2

Out[12]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
3

Extracting

Để extracting (trích xuất) các chuỗi con trong từng phần tử thì Pandas cung cấp cho ta 2 phương thức sau:

  • extract: trích xuất giá trị khớp đầu tiên
  • extractall: trích xuất tất cả các giá trị khớp

Các phương thức trên đều chấp nhận regex làm tham số. Ta sẽ thử một ví dụ sau:

In[13]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
4

Out[13]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
5

Lưy ý rằng phương thức extract nhận tham số expand mặc định là True, với True thì kết quả trả về luôn là DataFrame, còn False thì kết quả trả về có thể là Index, Series hoặc DataFrame tuỳ thuộc vào dữ liệu và regex mà ta chỉ định:

In[14]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
6

Out[14]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
7

Chúng ta còn có thể đặt tên của cột khi trích xuất như sau:

In[15]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
8

Out[15]

print("Cách 1: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype=pd.StringDtype()))
print("\nCách 2: \n", pd.Series(['Freetuts', 'Học lập trình online'], dtype='string'))
print("\nCách 3: \n", pd.Series(['Freetuts', 'Học lập trình online']).astype('string'))
9

Khác với extract, phương thức extractall luôn luôn trả về là DataFrame và sẽ có một cột index tên là "match" chứa thứ tự xuất hiện tương ứng với regex:

In[16]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
0

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
1

Tách (spliting)

Để tách từng phần tử trong Series/Index theo pattern nhất định ta dùng phương thức split:

In[17]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
2

Out[17]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
3

Ta có thể lấy từng phần tử đã được tách ra bằng phương thức get hoặc index như trên:

In[18]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
4

Out[18]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
5

Ta có thể truyền tham số expand=True để trả về một DataFrame chứa từng phần tử đã được tách thay vì một mảng:

In[19]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
6

Out[19]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
7

Phức tạp hơn, chúng ta có thể giới hạn số lần chia bằng tham số n:

In[20]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
8

Out[20]

Cách 1: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 2: 
0                Freetuts
1    Học lập trình online
dtype: string

Cách 3: 
0                Freetuts
1    Học lập trình online
dtype: string
9

Pandas còn hỗ trợ thêm phương thức rsplit, phương thức này giống như split nhưng hoạt động ở chiều ngược lại (reverse):

In[21]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
0

Out[21]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
1

Thay thế (replacing)

Ta sử dụng phương thức replace để thay thế tường phần tử theo tham số truyền vào, tham số có thể là chuỗi thông thường cho tác vụ đơn giản hoặc là regex cho những thứ phức tạp hơn:

In[22]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
2

Out[22]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
3

Nối (concatenate)

Nối Series thành một chuỗi

Chúng ta dùng phương thức cat để nối các phần tử trong chuỗi, chúng ta có thể truyền tham số sep để chỉ định chuỗi ngăn cách khi nối, còn không thì mặc định sẽ là chuỗi rỗng (''):

In[23]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
4

Out[23]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
5

Nối một list với Series

Chúng ta có thể truyền vào tham số đầu tiên là một List bất kỳ (chiều dài phải tương đương Series), khi đó Series và List sẽ được ghép với nhau theo vị trí tương ứng:

In[24]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
6

Out[24]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
7

Nếu như xuất hiện NA thì ta có thể dùng tham số na_rep để điền vào các giá trị bị khuyết:

In[25]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
8

Out[25]

f_v = pd.Series(['Freetuts', 99, np.nan, 'Học lập trình', 'online', True], dtype='string')

print("series: \n", f_v)

print("\nGiá trị của phần tử số 1: ", f_v[1])
print("Kiểu dữ liệu của phần tử số 1: ", type(f_v[1]))
print("\nGiá trị của phần tử số 5:", f_v[5])
print("Kiểu dữ liệu của phần tử số 5:", type(f_v[5]))
9

Nối một DataFrame với Series

Ta hoàn toàn có thể nối một DataFrame với một Series tương tự như trên:

In[26]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
0

Out[26]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
1

Nối các object với Index có trật tự

Chúng ta có thể nối các object (DataFrame, Series) với nhau với trật tự của Index khác nhau. Khi đó tuỳ thuộc vào tham số join (mặc định là 'left'): 'left', 'outer', 'inner' hoặc 'right' mà kết quả sẽ khác nhau:

In[27]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
2

Out[27]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
3

3. Ví dụ thực tế

Chúng ta sẽ đi đến một ví dụ thực tế, bộ dữ liệu ta sử dụng sẽ là dữ liệu về tên và một số thông tin liên quan của các hành khách trên tàu Titanic, các bạn có thể tải về ở đây.

Đầu tiên ta sẽ import dữ liệu và xem qua một số cột của tập dữ liệu này:

In[28]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
4

Out[28]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
5

Ta có thể thấy họ và tên của những người trên tàu được phân cách bởi dấu phẩy, vậy ta có thể lấy được họ bằng cách:

In[29]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
6

Out[29]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
7

Và ta dễ dàng thêm một cột mới chứa họ của hành khách như sau:

In[30]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
8

Out[30]

series: 
0         Freetuts
1               99
2             <NA>
3    Học lập trình
4           online
5             True
dtype: string

Giá trị của phần tử số 1: 99
Kiểu dữ liệu của phần tử số 1: <class 'str'>

Giá trị của phần tử số 5: True
Kiểu dữ liệu của phần tử số 5: <class 'str'>
9

Ở trong cột "Tên", ta có thể thấy trước tên sẽ là danh xưng tương ứng, chẳng hạn như Mr., Mrs., Dr.,... Ta có thể sử dụng phương thức contains để tìm ra những hành khách là Tiến sĩ trên tàu Titanic:

In[31]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))
0

Out[31]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))
1

Ta thấy cột giới tính có 2 giá trị là male và female là tiếng Anh trong khi tên cột lại là tiếng Việt. Chúng ta có thể dùng phương thức replace để sửa lại:

In[32]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))
2

Out[32]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))
3

Sử dụng phương thức len ta có thể tìm được hành khách có tên dài nhất và ngắn nhất trên tàu Titanic:

In[33]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))
4

Out[33]

s = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='string')
o = pd.Series(['f', 'r', 'e', 'e', 't', 'u', 't', 's'], dtype='object')

print("Phần tử mang giá trị = 'e' (dtype='string'): \n", s.str.count('e'))
print("\nPhần tử mang giá trị = 'e' (dtype='object'): \n", o.str.count('e'))
5

Hành khách trên tàu có tên dài nhất là Mrs. Maria Josefa Perezde Soto y Vallejo Peñasco y Castellana đến từ Tây Ban Nha, còn người có tên ngắn nhất là Mr Ali Lam, một du khách tới từ Hong Kong, cả 2 đều được cứu sống sau vụ tai nạn này.

4. Tổng kết

Vậy là ta đã hoàn thành bài học về dữ liệu kiểu văn bản trong Pandas, đây là một kiểu dữ liệu rất phổ biến bên cạnh dữ liệu số thường thấy. Với bộ dữ liệu trên các bạn hãy thử thêm nhiều thao tác hơn với những phương thức mình đã giới thiệu ở trên để hiểu sâu hơn nhé. Hẹn gặp các bạn ở bài tiếp theo.