Pandas là một thư viện mã nguồn mở được phát triển bởi Wes McKinney vào năm 2008. Pandas được sử dụng chủ yếu để thao tác, phân tích và dọn dẹp dữ liệu. Pandas cung cấp rất nhiều cấu trúc dữ liệu cũng như các phép tính hỗ trợ thao tác dữ liệu số và dữ liệu thời gian(time series). Pandas nhanh, mạnh và hiệu quả.
Cái tên Pandas có nguồn gốc là Panel Data. Pandas hữu ích cho 5 thao tác chính với phân tích dữ liệu - Tải dữ liệu, quản lý, chuẩn bị, mô hình và phân tích dữ liệu.
1. Dataframe trong Pandas là gì?
2. Kết hợp các dataframe khác nhau như thế nào?
3. Có thể tạo một serie từ một đối tượng dictionary trong Pandas không?
4. Cách xác định và xử lý giá trị bị mất trong dataframe?
5. Reindexing trong Pandas là gì?
6. Cách thêm cột vào dataframe?
7. Các xoá chỉ mục, hàng và cột khỏi dataframe?
8. Có thể lấy mục từ serie A mà không ảnh hưởng đến serie B?
9. Có thể lấy phần không trùng của serie A và B hay không?
10. Trong khi import dữ liệu từ các nguồn khác nhau, có thể xác định ngày tháng hay không?
Một dataframe là một cấu trúc bảng có thể thay đổi dùng cho biểu diễn dữ liệu được gắn nhãn với các trục - hàng và cột.
Cú pháp tạo dataframe
import pandas as pd
dataframe = pd.DataFrame(data, index, columns, dtype)
Trong đó:
- data - biểu diễn các định dạng khác nhau như map, list, ndarray, series,...
- index - tham số tuỳ chọn dùng để biểu diễn một chỉ mục đến nhãn hàng.
- columns - tham số tuỳ chọn cho nhãn cột.
- dtype - kiểu dữ liệu cho từng cột. Cũng là tuỳ chọn.
Dataframe có thể kết hợp bằng các cách như sau:
- Phương thức append(): Phương thức này được sử dụng để xếp chồng các dataframe theo chiều ngang.
df1.append(df2)
- Phương thức concat(): Phương thức này được sử dụng để xếp chồng các khung dữ liệu theo chiều dọc. Nó hữu ích khi các dataframe có cùng cột và trường giống nhau.
pd.concat([df1, df2])
- Phương thức join(): Phương thức này dùng cho trích xuất dữ liệu từ dataframe khác có nhiều hơn một cột chung.
df1.join(df2)
Mảng một chiều có thể lưu trữ các kiểu dữ liệu khác nhau được gọi là một serie. Ta có thể tạo serie từ một đối tượng dictionary trong Pandas như sau:
import pandas as pd
dict_info = {'key1' : 2.0, 'key2' : 3.1, 'key3' : 2.2}
series_obj = pd.Series(dict_info)
print (series_obj)
Kết quả:
x 2.0
y 3.1
z 2.2
dtype: float64
Nếu một chỉ mục không được chỉ định trong phương thức input, thì các khoá của dictionary được sắp xếp theo thứ tự tăng dần để tạo chỉ mục. Trong trường hợp chỉ mục được truyền vào, thì các giá trị của nhãn chỉ mục sẽ được trích xuất từ dictionary.
Ta có thể xác định nếu một dataframe mất dữ liệu bằng cách dùng phương thức isnull()
và isna()
.
missing_data_count=df.isnull().sum()
Ta có thể xử lý dữ liệu bị mất bằng cách thay giá trị trong cột với 0:
df['column_name'].fillna(0)
Hoặc thay thế với giá trị trung bình của cột
df['column_name'] = df['column_name'].fillna((df['column_name'].mean()))
Reindexing là quá trình điều chỉnh dataframe thành một chỉ mục mới với logic điền tuỳ chọn. Nếu các giá trị bị thiếu trong chỉ mục trước, thì NaN/NA
được đặt vào vị trí. Một đối tượng mới được trả về trừ khi chỉ mục mới được tạo ra tương đương với chỉ mục hiện tại. Giá trị sao chép được đặt thành False
. Điều này cũng được sử dụng để thay đổi chỉ mục của các hàng và cột trong dataframe.
import pandas as pd
data_info = {'first' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'second' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(data_info)
#To add new column third
df['third']=pd.Series([10,20,30],index=['a','b','c'])
print (df)
#To add new column fourth
df['fourth']=df['first']+info['third']
print (df)
- Thực thi
del df.index.name
cho xoá chỉ mục bằng tên. - Hoặc gán
df.index.name
với None.
Ví dụ ta có dataframe:
Column 1
Names
John 1
Jack 2
Judy 3
Jim 4
Để xoá chỉ mục tên "Names":
df.index.name = None
# Or run the below:
# del df.index.name
print(df)
Kết quả
Column 1
John 1
Jack 2
Judy 3
Jim 4
- Phương thức
drop()
được dùng để xoá hàng/cột khỏi dataframe. - Đối số trục được truyền cho phương thức drop trong đó nếu giá trị là 0, nó chỉ ra là xóa một hàng còn nếu là 1, nó phải xoá cột.
- Ngoài ra, chúng ta có thể xóa các hàng/cột tại chỗ bằng cách đặt giá trị
inplace
thànhTrue
. Điều này đảm bảo rằng công việc được hoàn thành mà không cần phải phân công lại. - Có thể xóa các giá trị trùng lặp từ hàng/cột bằng cách sử dụng phương thức
drop_duplicates()
.
Điều này có thể thực hiện bằng cách sử dụng phương thức ~
(ký hiệu phủ định) và isin()
như dưới đây.
import pandas as pd
df1 = pd.Series([2, 4, 8, 10, 12])
df2 = pd.Series([8, 12, 10, 15, 16])
df1=df1[~df1.isin(df2)]
print(df1)
Kết quả:
Output:
0 2
1 4
dtype: int64
Chúng ta có thể thực hiện được điều này bằng cách thực hiện kết hợp cả hai serie, rồi lấy giao điểm của cả hai serie. Sau đó, chúng ta tiếp cận để lấy các mục của phần kết hợp mà không có trong danh sách giao điểm.
Code minh hoạ như sau:
import pandas as pd
import numpy as np
df1 = pd.Series([2, 4, 5, 8, 10])
df2 = pd.Series([8, 10, 13, 15, 17])
p_union = pd.Series(np.union1d(df1, df2)) # union of series
p_intersect = pd.Series(np.intersect1d(df1, df2)) # intersection of series
unique_elements = p_union[~p_union.isin(p_intersect)]
print(unique_elements)
Kết quả:
0 2
1 4
2 5
5 13
6 15
7 17
dtype: int64
Có, nhưng với một số trợ giúp. Chúng ta cần thêm đối số parse_dates
trong khi đang đọc dữ liệu từ các nguồn. Hãy xem xét một ví dụ trong đó ta đọc dữ liệu từ file CSV, ta có thể gặp các định dạng ngày giờ khác nhau mà thư viện Pandas không thể đọc được. Trong trường hợp này, Pandas cung cấp sự linh hoạt để xây dựng trình phân tích cú pháp ngày tùy chỉnh với sự trợ giúp của các hàm lambda như bên dưới:
import pandas as pd
from datetime import datetime
dateparser = lambda date_val: datetime.strptime(date_val, '%Y-%m-%d %H:%M:%S')
df = pd.read_csv("some_file.csv", parse_dates=['datetime_column'], date_parser=dateparser)