Giới thiệu về Pandas (một thư viện phổ biến của Python cho việc phân tích dữ liệu)
This post hasn't been updated for 5 years
Pandas
Pandas là một thư viện mã nguồn mở được xây dựng dựa trên NumPy, sử dụng thao tác và phân tích dữ liệu, được thiết kế để cho phép bạn làm việc với dữ liệu được gắn nhãn hoặc quan hệ theo cách trực quan hơn
- Có thể xử lý tập dữ liệu khác nhau về định dạng: chuỗi thời gian, bảng không đồng nhất, ma trận dữ liệu
- Khả năng import dữ liệu từ nhiều nguồn khác nhau như CSV, DB/SQL
- Có thể xử lý vô số phép toán cho tập dữ liệu: subsetting, slicing, filtering, merging, groupBy, re-ordering, and re-shaping,..
- Xử lý dữ liệu mất mát theo ý người dùng mong muốn: bỏ qua hoặc chuyển sang 0
- Xử lý, phân tích dữ liệu tốt như mô hình hoá và thống kê
- Tích hợp tốt với các thư viện khác của python
- Cung cấp hiệu suất tốt
Để cài đặt pandas nếu bạn có Anaconda chỉ cần gõ conda install pandas
hoặc sử dụng tools pip pip install pandas
.
Sau khi cài đặt xong, trong Python, chúng ta cần khai báo import pandas
để có thể bắt đầu sử dụng các hàm của pandas. Vì pandas là thư viện được sử dụng thường xuyên nên nó thường được khai báo gọn lại thành pd import pandas as pd
pd có thể thay thế bằng các từ khác, tuy nhiên bạn nên đặt là pd vì các tài liệu hướng dẫn đều ngầm quy ước như thế
Pandas có ba cấu trúc dữ liệu và nó được xây dựng dựa trên thư viện Numpy vậy nên chúng hoạt động rất nhanh và hiệu quả: Series, DataFrame, Panel. Trong đó Panel là mảng 3 chiều. Panel thì không được sử dụng rãi như như Series hay DataFrame và nó cũng không dễ hiển thị hay trừu tượng hoá như màn một chiều và hai chiều, nên dưới đây mình chỉ giới thiệu Series và DataFrame
Series
Series là mảng một chiều giống như mảng Numpy, hay như một cột của một bảng, nhưng nó bao gồm thêm một bảng đánh label. Series có thể được khởi tạo thông qua NumPy, kiểu Dict hoặc các dữ liệu vô hướng bình thường
Series có thể được tạo bằng cách sử dụng hàm tạo sau pandas.Series( data, index, dtype, copy)
Mô tả | |
---|---|
data | có nhiều dạng khác nhau như ndarray (mảng n chiều), list, constants |
index | Các giá trị index phải là duy nhất và có thể là hash có cùng độ dài với dữ liệu Mặc định np.arrange (n) nếu không có chỉ mục nào được thông qua |
dtype | loại dữ liệu. Nếu không có, kiểu dữ liệu sẽ được suy ra |
copy | Sao chép dữ liệu, mặc định là false |
Một Series có thể được tạo bằng các đầu vào khác nhau như: Array, Dict, Scalar value hoặc constant
Tạo một series rỗng:
Example 1:
#Khai báo thư viện pandas và khai báo nó là pd
import pandas as pd
s = pd.Series()
print s
Output của nó là như sau:
0 a
1 b
2 c
3 d
dtype: object
Khi chúng ta không truyền index, thì mặc định nó sẽ đánh từ 0 đến len(data)-1
Example 2:
#Khai báo thư viện pandas và khai báo nó là pd
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
print s
Output của nó
100 a
101 b
102 c
103 d
dtype: object
Chúng tôi đã truyền index ở đây. Bây giờ chúng ta có thể thấy các giá trị được lập index tùy chỉnh trong đầu ra
Tạo một Series từ dict
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print s
Output:
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
Chú ý: Thứ tự của index được duy trì và phần tử bị thiếu được lấp đầy bằng NaN (Không phải là số
Tạo một Series từ Scalar
Nếu dữ liệu là một giá trị scalar, index phải được cung cấp. Giá trị sẽ được lặp lại để phù hợp với độ dài của index
#import the pandas library and aliasing as pd
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print s
Output:
0 5
1 5
2 5
3 5
dtype: int64
Truy cập dữ liệu từ Series với Position
Dữ liệu trong series có thể được truy cập tương tự như dữ liệu trong một ndarray.
Example
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print s[0] # Lấy phần tử đầu tiên
Output:
1
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print s[:3] # Lấy 3 phần tử đầu tiên
Output:
a 1
b 2
c 3
dtype: int64
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print s[-3:] # Lấy 3 phần tử cuối cùng
Output:
c 3
d 4
e 5
dtype: int64
Truy xuất dữ liệu bằng Label (Index)
Example 1: Truy xuất một phần tử bằng giá trị index label
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
# Lấy một phần tử
print s['a'] # Output: 1
Example 2: Truy xuất nhiều phần tử bằng cách sử dụng danh sách các giá trị index label
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
# Lấy nhiều phần tử
print s[['a','c','d']]
Output:
a 1
c 3
d 4
dtype: int64
Example 3: Nếu label không tồn tại, thì sẽ ném exception
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
# Lấy một phần tử
print s['f']
Output:
…
KeyError: 'f'
DataFrame
Một Data frame là một cấu trúc dữ liệu 2 chiều, dữ liệu được sắp xếp theo kiểu bảng trong các hàng và cột có các đặc trưng sau:
- Các cột dữ liệu là các kiểu không đồng nhất: float64, int, bool, …
- Kích thước table có thể thay đổi: các cột có thể thêm hoặc xoá đi
- Các trục được dán nhãn (hàng và cột)
- Có thể thực hiện các phép toán số học trên các hàng và cột
Một DataFrame có thể được tạo bằng cách sử dụng hàm tạo sau pandas.DataFrame( data, index, columns, dtype, copy)
Mô tả | |
---|---|
data | dữ liệu có nhiều dạng khác nhau như ndarray, series, map, lists, dict, constants hoặc một DataFrame khác |
index | Đối với các row labels, Index được sử dụng cho resulting frame là Mặc định tùy chọn np.arrange (n) nếu không có index nào được thông qua |
columns | Đối với các column labels. cú pháp mặc định tùy chọn là - np.arrange(n) ,Điều này chỉ đúng nếu không có index nào được thông qua |
dtype | Kiểu dữ liệu của từng cột |
copy | Sao chép dữ liệu, mặc định là false |
Một DataFrame có thể được tạo bằng các đầu vào khác nhau như: Lists, Dict, Series, Numpy ndarrays, DataFrame khác
Tạo một DataFrame rỗng
#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df
Output:
Empty DataFrame
Columns: []
Index: []
Tạo một DataFrame từ Lists
Example 1: Tạo bằng một list
import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df
Output:
0
0 1
1 2
2 3
3 4
4 5
Example 2: Tạo từ một danh sach các lists
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df
Output:
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
Example 3:
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df
Output:
Name Age
0 Alex 10.0
1 Bob 12.0
2 Clarke 13.0
Chú ý: tham số dtype thay đổi kiểu dữ liệu cột Age thành float
Tạo một DataFrame từ Dict của ndarrays / Lists
Tất cả các ndarrays phải có cùng độ dài. Nếu index được thông qua, thì độ dài của index sẽ bằng với độ dài của mảng
Nếu không có index nào được truyền, thì theo mặc định, index sẽ là range (n), trong đó n là độ dài mảng
Example 1:
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df
Output:
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
Chú thich: Quan sát các giá trị 0,1,2,3. Chúng là index mặc định được gán cho từng row sử dụng hàm range(n).
Example 2: Bây giờ chúng ta hãy tạo một DataFrame được lập index bằng cách sử dụng các arrays
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df
Output:
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
Chú thich: Tham số index gán một index cho mỗi hàng
Tạo một DataFrame từ một danh sách của Dicts
Danh sách Dictionaries có thể được chuyển qua dưới dạng dữ liệu đầu vào để tạo DataFrame. Các keys của Dictionaries theo mặc định được lấy làm tên cột
Example 1: Ví dụ sau đây cho thấy cách tạo DataFrame bằng cách truyền một list các dictionaries
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df
Output:
a b c
0 1 2 NaN
1 5 10 20.0
Chú thích: NaN (Not a Number) được thêm vào các khu vực bị thiếu
Example 2: Ví dụ sau đây cho thấy cách tạo DataFrame bằng cách chuyển danh sách dictionaries và các index hàng
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df
Output:
a b c
first 1 2 NaN
second 5 10 20.0
Example 3: Ví dụ sau đây cho thấy cách tạo DataFrame với danh sách dictionaries, index hàng và index cột
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2
Output:
#df1 output
a b
first 1 2
second 5 10
#df2 output
a b1
first 1 NaN
second 5 NaN
Chú thích: df2 DataFrame được tạo với một index cột khác với khóa của dictionary, do đó, nối thêm NaN vào vị trí. Trong khi đó, df1 được tạo với các index cột giống như các khóa của dictionary
Tạo một DataFrame từ Dict của Series
Dictionary của Series có thể được thông qua để tạo thành một DataFrame. Index là sự kết hợp của tất cả các index được thông qua
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df
Output:
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
Note: Quan sát series thứ nhất, không có nhãn ‘d’ được thông qua, nhưng kết quả là, đối với nhãn d, NaN được gắn vào
Column Selection
Chúng tôi sẽ hiểu điều này bằng cách chọn một cột từ DataFrame
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df ['one']
Output:
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
Column Addition
Chúng tôi sẽ hiểu điều này bằng cách thêm một cột mới vào DataFrame hiện có
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# Adding a new column to an existing DataFrame object with column label by passing new series
print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df
print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']
print df
Output:
Adding a new column by passing as Series:
one two three
a 1.0 1 10.0
b 2.0 2 20.0
c 3.0 3 30.0
d NaN 4 NaN
Adding a new column using the existing columns in DataFrame:
one two three four
a 1.0 1 10.0 11.0
b 2.0 2 20.0 22.0
c 3.0 3 30.0 33.0
d NaN 4 NaN NaN
Column Deletion
Cột có thể bị xóa hoặc popped; hãy để mình lấy một ví dụ để hiểu làm thế nào
# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print df
# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df
# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df
Output:
Our dataframe is:
one three two
a 1.0 10.0 1
b 2.0 20.0 2
c 3.0 30.0 3
d NaN NaN 4
Deleting the first column using DEL function:
three two
a 10.0 1
b 20.0 2
c 30.0 3
d NaN 4
Deleting another column using POP function:
three
a 10.0
b 20.0
c 30.0
d NaN
Row Selection, Addition, and Deletion
Bây giờ chúng ta sẽ hiểu selection hàng, addition và deletion thông qua các ví dụ. Hãy bắt đầu với khái niệm selection
Selection by Label
Hàng có thể được chọn bằng cách chuyển label hàng cho hàm loc
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.loc['b']
Output:
one 2.0
two 2.0
Name: b, dtype: float64
Kết quả là một series có label là tên cột của DataFrame. Và tên của series là label mà nó được lấy
Selection by integer location
Hàng có thể được chọn bằng cách chuyển vị trí số nguyên cho hàm iloc
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.iloc[2]
Output:
one 3.0
two 3.0
Name: c, dtype: float64
Slice Rows
Có thể chọn nhiều hàng bằng cách sử dụng toán tử ‘:'
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df[2:4]
Output:
one two
c 3.0 3
d NaN 4
Addition of Rows
Thêm hàng mới vào DataFrame bằng function append. Hàm này sẽ nối các hàng ở cuối
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
print df
Output:
a b
0 1 2
1 3 4
0 5 6
1 7 8
Deletion of Rows Dùng index label để xóa hoặc drop hàng từ DataFrame. Nếu nhãn được nhân đôi, thì nhiều hàng sẽ bị loại bỏ
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
# Drop rows with label 0
df = df.drop(0)
print df
Output:
a b
1 3 4
1 7 8
Kết Luận
Trên đây mình chỉ giới thiệu sơ lược về Pandas cũng như 3 cấu trúc chính của Pandas: Series là các mảng một chiều, DataFrame là mảng hai chiều, và Panel là 3 chiều. Ở bài tiếp theo mình sẽ giới thiệu cách thao tác với CSV file, cơ sở dữ liệu và một số hàm hữu ích khác của Pandas
Tài liệu tham khảo
Bài viết được dịch từ nguồn: python pandas tutorials
All Rights Reserved