Khám phá cấu trúc Series trong Pandas: Tạo lập, truy xuất và xử lý dữ liệu một chiều

Pandas là thư viện xử lý dữ liệu mạnh mẽ được xây dựng dựa trên nền tảng NumPy, hỗ trợ toàn diện cho các tác vụ phân tích và khai thác thông tin. Cấu trúc cốt lõi của thư viện bao gồm Series (dữ liệu một chiều) và DataFrame (dữ liệu hai chiều dạng bảng). Trong phần này, chúng ta sẽ tập trung vào cách thức vận hành, truy xuất và tối ưu hóa Series cho các bài toán thực tế.

Khởi tạo đối tượng Series

Đối tượng Series hoạt động tương tự mảng một chiều nhưng được bổ sung khả năng gán nhãn chỉ mục linh hoạt. Cấu trúc bên trong bao gồm mảng lưu trữ dữ liệu và mảng chỉ số tương ứng.

Khởi tạo từ danh sách hoặc mảng NumPy

import pandas as pd
import numpy as np

# Gán nhãn chỉ mục tùy chỉnh cho từng giai đoạn
doanh_thu_tuan = pd.Series(
    data=[4500, 3200, 5100, 2800],
    index=['T1', 'T2', 'T3', 'T4']
)
print(doanh_thu_tuan)

Khi không khai báo tham số index, Pandas sẽ tự động sinh chỉ số nguyên bắt đầu từ 0.

Khởi tạo từ từ điển (Dictionary)

# Khóa từ điển sẽ trở thành chỉ mục, giá trị thành dữ liệu
doanh_thu_dict = pd.Series({
    'T1': 4500,
    'T2': 3200,
    'T3': 5100,
    'T4': 2800
})
print(doanh_thu_dict)

Truy xuất và cắt đoạn dữ liệu

Việc truy cập phần tử trong Series hỗ trợ cả chỉ số vị trí (integer) và nhãn chỉ mục (label), giúp linh hoạt trong quá trình phân tích.

Sử dụng chỉ số nguyên

print(doanh_thu_dict[0], doanh_thu_dict[2])
# Cập nhật giá trị theo vị trí
doanh_thu_dict[[0, 3]] = [4800, 3100]
print(doanh_thu_dict)

Lưu ý: Nếu muốn dùng chỉ số âm, bắt buộc phải khai báo index với kiểu dữ liệu không phải số khi khởi tạo.

Sử dụng nhãn chỉ mục

print(doanh_thu_dict['T1'], doanh_thu_dict['T3'])
doanh_thu_dict['T1'] = 5000
print(doanh_thu_dict)

Cắt đoạn (Slicing)

# Cắt theo vị trí: bao gồm đầu, loại trừ cuối
print(doanh_thu_dict[1:3])
# Cắt theo nhãn: bao gồm cả hai đầu mút
print(doanh_thu_dict['T2':'T4'])

Truy xuất nâng cao

# Fancy indexing: chọn nhiều nhãn không liên tiếp
print(doanh_thu_dict[['T2', 'T4']])
# Boolean indexing: lọc điều kiện
print(doanh_thu_dict[doanh_thu_dict >= 4000])

Thuộc tính và phương thức cốt lõi

Thuộc tínhChức năng
dtypeKiểu dữ liệu của Series
indexTập hợp chỉ mục
valuesMảng dữ liệu gốc dạng NumPy
sizeSố lượng phần tử
hasnansKiểm tra sự tồn tại của giá trị NULL
loc / ilocTruy xuất theo nhãn / vị trí
is_monotonic_increasingKiểm tra tính đơn điệu tăng
is_uniqueKiểm tra tính duy nhất của dữ liệu

Phân tích thống kê mô tả

Pandas tích hợp sẵn các hàm tính toán chỉ số thống kê nhanh chóng, thay thế việc viết vòng lặp thủ công.

# Tính toán nhanh các chỉ số cơ bản
print(f"Tổng: {doanh_thu_dict.sum()}")
print(f"Trung bình: {doanh_thu_dict.mean()}")
print(f"Độ lệch chuẩn: {doanh_thu_dict.std()}")
print(f"Phương sai: {doanh_thu_dict.var()}")

# Tổng hợp toàn bộ chỉ số thống kê
stats_summary = doanh_thu_dict.describe()
print(stats_summary)
print(stats_summary['50%']) # Truy cập trực tiếp qua chỉ mục

Đối với dữ liệu phân loại hoặc chuỗi, các phương thức như value_counts()nunique() sẽ cực kỳ hữu ích.

san_pham = pd.Series(['Laptop', 'Mouse', 'Keyboard', 'Mouse', 'Laptop', 'Laptop', 'USB'])
print(san_pham.value_counts())
print(f"Số loại sản phẩm khác nhau: {san_pham.nunique()}")

Xử lý dữ liệu thô

Trong thực tế, dữ liệu thường chứa giá trị thiếu hoặc nhiễu. Pandas cung cấp bộ công cụ làm sạch dữ liệu chuẩn xác.

du_lieu_hoa = pd.Series([15, np.nan, 22, np.nan, 18, 30])

# Kiểm tra và loại bỏ giá trị null
print(du_lieu_hoa.isna())
du_lieu_sach = du_lieu_hoa.dropna()

# Điền khuyết theo quy tắc
du_lieu_canh_2 = du_lieu_hoa.fillna(value=du_lieu_hoa.mean()) # Điền bằng trung bình
du_lieu_canh_3 = du_lieu_hoa.fillna(method='bfill')           # Điền bằng giá trị phía sau

Chú ý quan trọng: Các hàm dropna()fillna() đều nhận tham số inplace=False theo mặc định. Nếu đặt thành True, đối tượng gốc sẽ bị ghi đè trực tiếp thay vì trả về bản sao mới.

Để thay thế giá trị dựa trên điều kiện logic, sử dụng where()mask() (hai hàm này hoạt động ngược chiều nhau).

diem_so = pd.Series([75, 82, 60, 95, 55])
# where: giữ nguyên khi đúng điều kiện, thay thế khi sai
print(diem_so.where(diem_so >= 60, other='Trượt'))
# mask: thay thế khi đúng điều kiện, giữ nguyên khi sai
print(diem_so.mask(diem_so > 80, other='Xuất sắc'))

Loại bỏ bản ghi trùng lặp:

khach_hang = pd.Series(['A', 'B', 'A', 'C', 'B', 'B'])
print(khach_hang.duplicated()) # Trả về mảng boolean
print(khach_hang.drop_duplicates()) # Giữ lại lần xuất hiện đầu tiên

Ánh xạ và biến đổi dữ liệu với map()apply():

thanh_phan = pd.Series(['New York', 'London', np.nan, 'Tokyo'])
# Map theo từ điển
anh_xa_dict = thanh_phan.map({'New York': 'USA', 'London': 'UK', 'Tokyo': 'JP'})
# Map bằng hàm định dạng chuỗi
anh_xa_func = thanh_phan.map(lambda x: f"Đô thị: {x.upper()}" if pd.notna(x) else x)

# Apply cho phép truyền thêm tham số hoặc dùng hàm numpy
van_toan = pd.Series([10, 25, 30, 15])
print(van_toan.apply(np.sqrt).round(2))
print(van_toan.apply(lambda x, n: x * n, args=(2,)))

Sắp xếp và lấy top N

Thay vì sắp xếp toàn bộ mảng tốn kém tài nguyên, Pandas cung cấp phương thức tối ưu để lấy nhanh giá trị cực đại/cực tiểu.

thanh_phan_gia = pd.Series(
    [450, 120, 300, 500, 210],
    index=['Áo', 'Giày', 'Mũ', 'Váy', 'Đồ']
)
# Sắp xếp tăng dần theo giá trị
print(thanh_phan_gia.sort_values(ascending=True, na_position='last'))
# Sắp xếp giảm dần theo chỉ mục
print(thanh_phan_gia.sort_index(ascending=False))

# Lấy top 2 giá trị cao nhất và thấp nhất
print(thanh_phan_gia.nlargest(2))
print(thanh_phan_gia.nsmallest(2))

Hình ảnh hóa dữ liệu

Series tích hợp sẵn phương thức plot() kết nối trực tiếp với Matplotlib, rút ngắn đáng kể quy trình vẽ biểu đồ.

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

doanh_su_quy = pd.Series([2.1, 3.4, 2.8, 4.2], index=['Q1', 'Q2', 'Q3', 'Q4'])

# Vẽ biểu đồ cột với giá trị chú thích
ax = doanh_su_quy.plot(kind='bar', color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728'])
for i, val in enumerate(doanh_su_quy):
    ax.text(i, val + 0.1, f'{val}B', ha='center', fontsize=9)
plt.ylabel('Doanh thu (tỷ VND)')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

# Vẽ biểu đồ tròn
doanh_su_quy.plot(kind='pie', autopct='%1.1f%%', colors=['#aec7e8', '#ffbb78', '#98df8a', '#ff9896'])
plt.ylabel('')
plt.show()

Thẻ: Pandas python data-analysis series matplotlib

Đăng vào ngày 29 tháng 5 lúc 03:01