{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Công cụ - pandas**\n", "\n", "*Thư viện `pandas` cung cấp các công cụ phân tích dữ liệu và cấu trúc dữ liệu hiệu suất cao, dễ sử dụng. Cấu trúc dữ liệu còn được gọi là `DataFrame`, mà bạn có thể xem như bảng 2D trong bộ nhớ (giống như bảng tính, có tên cột và nhãn hàng). Nhiều tính năng có sẵn trong Excel có được hỗ trợ trong pandas, chẳng hạn như tạo bảng tổng hợp, tính toán cột dựa trên các cột khác, vẽ đồ thị, v.v. Bạn cũng có thể nhóm các hàng theo giá trị cột hoặc nối các bảng giống như trong SQL. Pandas cũng rất mạnh mẽ trong việc xử lý chuỗi thời gian.*\n", "\n", "Điều kiện tiên quyết:\n", "* NumPy – nếu bạn chưa quen với NumPy, chúng tôi khuyên bạn nên xem [Hướng dẫn về NumPy](tools_numpy.ipynb) ngay bây giờ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", "
\n", " \"Open\n", " \n", " \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Cài đặt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Đầu tiên, hãy nạp `pandas`. Mọi người thường nạp nó dưới dạng `pd`:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Đối tượng `Series`\n", "Thư viện `pandas` chứa các cấu trúc dữ liệu hữu ích sau:\n", "* Các đối tượng `Series` mà chúng ta sẽ thảo luận ngay bây giờ. Đối tượng `Series` là mảng 1D, tương tự như cột trong bảng tính (có tên cột và nhãn hàng).\n", "* Các đối tượng `DataFrame`. Đây là bảng 2D, tương tự như bảng tính (có tên cột và nhãn hàng).\n", "* Các đối tượng `Panel`. Bạn có thể xem `Panel` dưới dạng từ điển của `DataFrame`. Chúng ít được sử dụng hơn, vì vậy chúng ta sẽ không thảo luận về chúng ở đây." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tạo `Series`\n", "Hãy bắt đầu bằng cách tạo đối tượng `Series` đầu tiên của chúng ta!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2\n", "1 -1\n", "2 3\n", "3 5\n", "dtype: int64" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([2,-1,3,5])\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tương tự như `ndarray` 1D\n", "Các đối tượng `Series` hoạt động giống như các `ndarray` NumPy một chiều và bạn thường có thể chuyển chúng dưới dạng tham số cho các hàm NumPy:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 7.389056\n", "1 0.367879\n", "2 20.085537\n", "3 148.413159\n", "dtype: float64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.exp(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Các phép toán số học trên `Series` cũng có thể thực hiện được và chúng áp dụng *theo từng phần tử*, giống như đối với `ndarray`:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1002\n", "1 1999\n", "2 3003\n", "3 4005\n", "dtype: int64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s + [1000,2000,3000,4000]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tương tự như NumPy, nếu bạn thêm một số vào `Series`, thì số đó sẽ được thêm vào tất cả các mục trong `Series`. Điều này được gọi là *broadcasting*:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1002\n", "1 999\n", "2 1003\n", "3 1005\n", "dtype: int64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s + 1000" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Điều này cũng đúng với tất cả các phép toán nhị phân như `*` hoặc `/`, và thậm chí cả các phép toán có điều kiện:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 True\n", "2 False\n", "3 False\n", "dtype: bool" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s < 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Nhãn chỉ mục\n", "Mỗi mục trong đối tượng `Series` có một mã định danh duy nhất được gọi là *nhãn chỉ mục*. Theo mặc định, nó chỉ đơn giản là thứ hạng của mục trong `Series` (bắt đầu từ `0`) nhưng bạn cũng có thể đặt nhãn chỉ mục theo cách thủ công:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice 68\n", "bob 83\n", "charles 112\n", "darwin 68\n", "dtype: int64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2 = pd.Series([68, 83, 112, 68], index=[\"alice\", \"bob\", \"charles\", \"darwin\"])\n", "s2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sau đó, bạn có thể sử dụng `Series` giống như `dict`:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "83" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2[\"bob\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn vẫn có thể truy cập các mục theo vị trí số nguyên, giống như trong một mảng thông thường:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "83" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Để làm rõ khi bạn đang truy cập theo nhãn hoặc theo vị trí số nguyên, bạn nên luôn sử dụng thuộc tính `loc` khi truy cập theo nhãn và thuộc tính `iloc` khi truy cập theo vị trí số nguyên:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "83" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2.loc[\"bob\"]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "83" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2.iloc[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ta cũng có thể cắt một `Series` sử dụng các nhãn chỉ mục:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "bob 83\n", "charles 112\n", "dtype: int64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2.iloc[1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Điều này có thể dẫn đến kết quả không mong muốn khi sử dụng nhãn số mặc định, vì vậy hãy cẩn thận:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1000\n", "1 1001\n", "2 1002\n", "3 1003\n", "dtype: int64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "surprise = pd.Series([1000, 1001, 1002, 1003])\n", "surprise" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 1002\n", "3 1003\n", "dtype: int64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "surprise_slice = surprise[2:]\n", "surprise_slice" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ồ! Phần tử đầu tiên có nhãn chỉ mục `2`. Phần tử có nhãn chỉ mục `0` không có trong lát cắt:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Key error: 0\n" ] } ], "source": [ "try:\n", " surprise_slice[0]\n", "except KeyError as e:\n", " print(\"Key error:\", e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nhưng hãy nhớ rằng bạn có thể truy cập các phần tử theo vị trí số nguyên bằng cách sử dụng thuộc tính `iloc`. Điều này minh họa một lý do khác tại sao việc sử dụng `loc` và `iloc` để truy cập các đối tượng `Series` luôn tốt hơn:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1002" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "surprise_slice.iloc[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Khởi tạo từ `dict`\n", "Bạn có thể tạo đối tượng `Series` từ `dict`. Các khóa sẽ được sử dụng làm nhãn chỉ mục:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice 68\n", "bob 83\n", "colin 86\n", "darwin 68\n", "dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights = {\"alice\": 68, \"bob\": 83, \"colin\": 86, \"darwin\": 68}\n", "s3 = pd.Series(weights)\n", "s3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể kiểm soát những thành phần nào bạn muốn đưa vào `Series` và theo thứ tự nào bằng cách chỉ định rõ ràng `chỉ mục` mong muốn:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "colin 86\n", "alice 68\n", "dtype: int64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s4 = pd.Series(weights, index = [\"colin\", \"alice\"])\n", "s4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Căn chỉnh tự động\n", "Khi một thao tác liên quan đến nhiều đối tượng `Series`, `pandas` sẽ tự động căn chỉnh các mục bằng cách khớp các nhãn chỉ mục." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['alice', 'bob', 'charles', 'darwin'], dtype='object')\n", "Index(['alice', 'bob', 'colin', 'darwin'], dtype='object')\n" ] }, { "data": { "text/plain": [ "alice 136.0\n", "bob 166.0\n", "charles NaN\n", "colin NaN\n", "darwin 136.0\n", "dtype: float64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(s2.keys())\n", "print(s3.keys())\n", "\n", "s2 + s3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Series` kết quả chứa sự kết hợp của các nhãn chỉ mục từ `s2` và `s3`. Vì `\"colin\"` bị thiếu trong `s2` và `\"charles\"` bị thiếu trong `s3`, nên các mục này có giá trị kết quả `NaN`. (tức là. Not-a-Number có nghĩa là *thiếu số*).\n", "\n", "Căn chỉnh tự động rất tiện dụng khi làm việc với dữ liệu có thể đến từ nhiều nguồn khác nhau với cấu trúc khác nhau và các mục bị thiếu. Nhưng nếu bạn quên đặt đúng nhãn chỉ mục, bạn có thể nhận được kết quả khá ngạc nhiên:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s2 = [ 68 83 112 68]\n", "s5 = [1000 1000 1000 1000]\n" ] }, { "data": { "text/plain": [ "alice NaN\n", "bob NaN\n", "charles NaN\n", "darwin NaN\n", "0 NaN\n", "1 NaN\n", "2 NaN\n", "3 NaN\n", "dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s5 = pd.Series([1000,1000,1000,1000])\n", "print(\"s2 =\", s2.values)\n", "print(\"s5 =\", s5.values)\n", "\n", "s2 + s5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas không thể căn chỉnh `Series`, vì nhãn của chúng hoàn toàn không khớp, do đó kết quả chứa đầy `NaN`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Khởi tạo với số vô hướng\n", "Bạn cũng có thể khởi tạo đối tượng `Series` bằng cách sử dụng số vô hướng và danh sách các nhãn chỉ mục: tất cả các mục sẽ được đặt thành số vô hướng." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "life 42\n", "universe 42\n", "everything 42\n", "dtype: int64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "meaning = pd.Series(42, [\"life\", \"universe\", \"everything\"])\n", "meaning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tên `Series`\n", "`Series` có thể có `tên`:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "bob 83\n", "alice 68\n", "Name: weights, dtype: int64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s6 = pd.Series([83, 68], index=[\"bob\", \"alice\"], name=\"weights\")\n", "s6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vẽ đồ thị `Series`\n", "Pandas giúp dễ dàng vẽ biểu đồ dữ liệu `Series` bằng matplotlib (để biết thêm chi tiết về matplotlib, hãy xem [hướng dẫn matplotlib](tools_matplotlib.ipynb)). Chỉ cần nhập matplotlib và gọi phương thức `plot()`:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "temperatures = [4.4,5.1,6.1,6.2,6.1,6.1,5.7,5.2,4.7,4.1,3.9,3.5]\n", "s7 = pd.Series(temperatures, name=\"Temperature\")\n", "s7.plot()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Có *nhiều* tùy chọn để vẽ biểu đồ dữ liệu của bạn. Không cần thiết phải liệt kê tất cả chúng ở đây: nếu bạn cần một loại biểu đồ cụ thể (biểu đồ tần số, biểu đồ hình tròn, v.v.), chỉ cần tìm nó trong [Trực quan hóa](http://pandas.pydata.org/pandas-docs/stable/visualization.html) trong tài liệu của pandas và xem mã ví dụ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Xử lý thời gian\n", "Nhiều bộ dữ liệu có mốc thời gian và pandas rất giỏi trong thao tác với các dữ liệu đó:\n", "* nó có thể đại diện cho các khoảng thời gian (chẳng hạn như 2016Q3) và tần suất (chẳng hạn như \"hàng tháng\"),\n", "* nó có thể chuyển đổi các khoảng thời gian thành mốc thời gian thực và *ngược lại*,\n", "* nó có thể lấy mẫu lại dữ liệu và tổng hợp các giá trị theo bất kỳ cách nào bạn muốn.\n", "* nó có thể xử lý các múi giờ.\n", "\n", "## Khoảng thời gian\n", "Hãy bắt đầu bằng cách tạo một chuỗi thời gian bằng cách sử dụng `pd.date_range()`. Thao tác này trả về một `DatetimeIndex` chứa mỗi giờ trong 12 giờ bắt đầu từ ngày 29 tháng 10 năm 2016 lúc 5:30 chiều." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-10-29 17:30:00', '2016-10-29 18:30:00',\n", " '2016-10-29 19:30:00', '2016-10-29 20:30:00',\n", " '2016-10-29 21:30:00', '2016-10-29 22:30:00',\n", " '2016-10-29 23:30:00', '2016-10-30 00:30:00',\n", " '2016-10-30 01:30:00', '2016-10-30 02:30:00',\n", " '2016-10-30 03:30:00', '2016-10-30 04:30:00'],\n", " dtype='datetime64[ns]', freq='H')" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates = pd.date_range('2016/10/29 5:30pm', periods=12, freq='H')\n", "dates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`DatetimeIndex` này có thể được sử dụng làm chỉ mục trong `Series`:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 17:30:00 4.4\n", "2016-10-29 18:30:00 5.1\n", "2016-10-29 19:30:00 6.1\n", "2016-10-29 20:30:00 6.2\n", "2016-10-29 21:30:00 6.1\n", "2016-10-29 22:30:00 6.1\n", "2016-10-29 23:30:00 5.7\n", "2016-10-30 00:30:00 5.2\n", "2016-10-30 01:30:00 4.7\n", "2016-10-30 02:30:00 4.1\n", "2016-10-30 03:30:00 3.9\n", "2016-10-30 04:30:00 3.5\n", "Freq: H, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series = pd.Series(temperatures, dates)\n", "temp_series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hãy vẽ đồ thị Series này:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "temp_series.plot(kind=\"bar\")\n", "\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lấy mẫu lại\n", "Pandas cho phép chúng ta dễ dàng lấy mẫu lại một chuỗi thời gian. Chỉ cần gọi phương thức `resample()` và chỉ định một tần suất mới:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndexResampler [freq=<2 * Hours>, axis=0, closed=left, label=left, convention=start, base=0]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_freq_2H = temp_series.resample(\"2H\")\n", "temp_series_freq_2H" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hoạt động lấy mẫu lại thực ra là một hoạt động bị hoãn, đó là lý do tại sao chúng ta không nhận được đối tượng `Series` mà thay vào đó là đối tượng `DatetimeIndexResampler`. Để thực sự thực hiện thao tác lấy mẫu lại, chúng ta chỉ cần gọi phương thức `mean()`: Pandas sẽ tính giá trị trung bình của mỗi cặp giờ liên tiếp:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "temp_series_freq_2H = temp_series_freq_2H.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hãy vẽ kết quả:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "temp_series_freq_2H.plot(kind=\"bar\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý cách các giá trị tự động được tổng hợp thành các khoảng thời gian 2 giờ. Ví dụ: nếu chúng ta xem xét khoảng thời gian 6-8 giờ tối, thì ta có giá trị là `5,1` lúc 6:30 chiều và `6,1` lúc 7:30 tối. Sau khi lấy mẫu lại, chúng ta chỉ có một giá trị là `5.6`, là giá trị trung bình của `5.1` và `6.1`. Thay vì tính toán giá trị trung bình, chúng ta có thể sử dụng bất kỳ hàm tổng hợp nào khác, ví dụ: chúng ta có thể quyết định giữ giá trị nhỏ nhất của mỗi khoảng thời gian:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 16:00:00 4.4\n", "2016-10-29 18:00:00 5.1\n", "2016-10-29 20:00:00 6.1\n", "2016-10-29 22:00:00 5.7\n", "2016-10-30 00:00:00 4.7\n", "2016-10-30 02:00:00 3.9\n", "2016-10-30 04:00:00 3.5\n", "Freq: 2H, dtype: float64" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_freq_2H = temp_series.resample(\"2H\").min()\n", "temp_series_freq_2H" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hoặc tương tự, chúng ta có thể sử dụng phương thức `apply()` để thay thế:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 16:00:00 4.4\n", "2016-10-29 18:00:00 5.1\n", "2016-10-29 20:00:00 6.1\n", "2016-10-29 22:00:00 5.7\n", "2016-10-30 00:00:00 4.7\n", "2016-10-30 02:00:00 3.9\n", "2016-10-30 04:00:00 3.5\n", "Freq: 2H, dtype: float64" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_freq_2H = temp_series.resample(\"2H\").apply(np.min)\n", "temp_series_freq_2H" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lấy mẫu lên và nội suy\n", "Ở trên là một ví dụ về lấy mẫu xuống. Chúng ta cũng có thể lấy mẫu lên (tức là tăng tần suất), nhưng điều này tạo ra lỗ hổng trong dữ liệu:" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 17:30:00 4.4\n", "2016-10-29 17:45:00 NaN\n", "2016-10-29 18:00:00 NaN\n", "2016-10-29 18:15:00 NaN\n", "2016-10-29 18:30:00 5.1\n", "2016-10-29 18:45:00 NaN\n", "2016-10-29 19:00:00 NaN\n", "2016-10-29 19:15:00 NaN\n", "2016-10-29 19:30:00 6.1\n", "2016-10-29 19:45:00 NaN\n", "Freq: 15T, dtype: float64" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_freq_15min = temp_series.resample(\"15Min\").mean()\n", "temp_series_freq_15min.head(n=10) # `head` displays the top n values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Một giải pháp là lấp đầy khoảng trống bằng cách nội suy. Chúng ta chỉ cần gọi phương thức `interpolate()`. Mặc định là sử dụng phép nội suy tuyến tính, nhưng chúng ta cũng có thể chọn một phương pháp khác, chẳng hạn như phép nội suy bậc ba:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "2016-10-29 17:30:00 4.400000\n", "2016-10-29 17:45:00 4.452911\n", "2016-10-29 18:00:00 4.605113\n", "2016-10-29 18:15:00 4.829758\n", "2016-10-29 18:30:00 5.100000\n", "2016-10-29 18:45:00 5.388992\n", "2016-10-29 19:00:00 5.669887\n", "2016-10-29 19:15:00 5.915839\n", "2016-10-29 19:30:00 6.100000\n", "2016-10-29 19:45:00 6.203621\n", "Freq: 15T, dtype: float64" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_freq_15min = temp_series.resample(\"15Min\").interpolate(method=\"cubic\")\n", "temp_series_freq_15min.head(n=10)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD7CAYAAACG50QgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3Xd4FFX3wPHv2fQGARJqgNA7hCI90pQiCAgW7KiIFMtPBctr91XBF7uCiIAUsYGCiojYEEEEEghFaSJIh5BAKElIu78/ZsGIoWU3md3s+TzPPsnuzM45s9mcuXNn5o4YY1BKKeUbHHYnoJRSqvho0VdKKR+iRV8ppXyIFn2llPIhWvSVUsqHaNFXSikfokVfKaV8iBZ9pZTyIVr0lVLKh/jbncCZoqKiTGxsrN1pKKWUV0lMTDxkjIk+33weV/RjY2NJSEiwOw2llPIqIvLXhcyn3TtKKeVDtOgrpZQP0aKvlFI+xOP69JVSBcvOzmb37t1kZmbanYqyUXBwMDExMQQEBBTq/Vr0lfISu3fvJiIigtjYWETE7nSUDYwxpKSksHv3bmrUqFGoZWj3jlJeIjMzk3LlymnB92EiQrly5Vza29OWvrfJzoQ/F8Om+bDlG8jJhJBICCkLIWUg1PkzpCyEl4fq7aF8Q9BCUSJowVeufge06HuDjMOw9Vur0G/9DrJPQGAE1LkcwitARqo1T3oqHNlp/Z55BEye9f7wClCzC9TqCjU7Q0QFO9dGKWUjLfqe7K/l8NNY2LEU8nIgvCI0uw7q94bYePAPOvt78/Lg6B7Y/hNs+wH++BbWfQRAbnQj9kW141DFeKo1v5yypcKKaYWUt/Pz86NJkybk5OTQoEEDpk+fTmho6AW/f8iQITzwwAM0bNjwguafNm0aCQkJvPXWW+ecr2fPnvz666907NiR+fPnFzhP586deemll2jVqtUF51sSadH3VOvnwLzhEFYe2t0N9ftAlZbguMDDMA4HRFYlq8kNbI6+kqTKKRzcmkCpPUtotD+RlgenEbNxMmk/hLLI/xL2VOiCX93LaVyzCg0rlSI4wK9o1095pZCQEJKSkgC48cYbmThxIg888MAFvTc3N5fJkycXSV6jR48mPT2dd955p0iWfy65ubn4+XnP/4sWfU9jDPzyJnz7BFTvAINmWX30F/RWw67UDNbsOszaXWkk7TrMhr1HycqxunmiwssQV/VWTla9D1MpkHL7f4HNX9H+4E+E7/2Jk3ue45fvG/E8rdgZ3Znq1WvSLCaSuGqR1CgXhsOh/cme4pkvf+P3vUfdusyGlUvx1JWNLnj++Ph41q1bB8D777/PG2+8QVZWFm3atGHChAn4+fkRHh7OXXfdxXfffcf48eN5/PHHT7e2P/zwQ1544QWMMfTu3ZsXX3wRgPfee48xY8YQGRlJs2bNCAo6xx6tU7du3Vi8ePF555s9ezYjRozgyJEjTJkyhfj4eDIzMxk+fDgJCQn4+/vzyiuv0KVLl3/tZfTp04dRo0bRuXPnf61Xx44dL/hzs5sWfU+Slwvf/AdWTIRGV0H/iRAQfNbZj6RnkbTryOkCv3Z3GqknsgAIDnDQpEppbmlbnbhqkcRVjaRKZMg/DwI1qA5drrfi7lpBztrPab15AV1OTIHUKfyeEsviVU15LK8pWwIb0qhqFHFVrWU1qxpJVPj5/xlVyZSTk8PXX39Nz5492bhxIx9//DHLli0jICCAESNGMGvWLG655RZOnDhBmzZtePnll//x/r179/Lwww+TmJhImTJl6N69O/PmzaNNmzY89dRTJCYmUrp0abp06ULz5s0B+OKLL0hISODZZ591Ke+VK1eyYMECnnnmmdNFW0RYv349mzZtonv37mzZsuWcyznbenkDLfqeIjsDPhsKG7+AtiOh+3P/6Mo5mZPLxn3HSNp52Cr0u9PYfugEYJ2YU6d8ON3qlyeuWiTNYiKpVzGCAL8L7Qryg+rtCaveHsxYSN4EmxfQYOt3NNi9gBF5X3DSEcKa/U34ensjns1twl+mIjFlQk5vBOKqRtKocmlCAr1nN9ebXUyL3J0yMjKIi4sDrJb+HXfcwaRJk0hMTOSSSy45PU/58uUB6xjAwIED/7WcVatW0blzZ6KjrUEhb7zxRpYsWQLwj9evu+660wW4b9++9O3b16X8BwwYAEDLli3ZsWMHAEuXLuWee+4BoH79+lSvXv28Rf9s6+UNtOh7gvRU+PB62LUCeryAaTuCHSnpJO06TNLOIyTtTmPj3qNk5VrdNOUjgoirGsk1rWKIi4mkSUxpIoILd3Xev4hA+QZQvgES/yBkHoUdPxP0x/e03fY9bbNXgj8cC67EH351WPlnVZZsiGFCXg3SHKWpXzHi9J5A86qR1IoOd71byBjITLMOTB/dC9npkJttHdzOzYbcrL9/9w+Cik2hUlMICHHPZ6JOy9+nf4oxhltvvZUxY8b8a/7g4GCP6u8+1VXk5+dHTk7OOef19/cnLy/v9PP858Z72npdDC36djv8F7kzB8CRnSyo9wKzN7Zi7aJvScvIBiA00I8mVUpzW4dYq0VdLZKKpYKL73zt4FLW2UL1e1vPU7bBth+I2LGU5vvW0vz4Eu4KtCYdDazAlvSarEiqyi+rolhAGFkBpalUoSKxVWOoH1uVZtWjKF/K2WWVc9La4GWk/vPn8YNwdDek7YG03Vaxzzp+cXmLH1RoCJVbWAfAq7SA6Abgp195d+vWrRv9+vXj/vvvp3z58qSmpnLs2DGqV69+1ve0bt2ae++9l0OHDlGmTBk+/PBD7rnnHlq3bs19991HSkoKpUqVYvbs2TRr1qxI84+Pj2fWrFl07dqVLVu2sHPnTurVq8fRo0eZMGECeXl57Nmzh5UrVxZpHsVF/wNsdPjATszETvjlnWRI1iMkrqtO3QqZ9Gpc8XRruU75cPwvtJumOJSrZT1a32k9zzgC+9fBvrWU2ptEq31raZn5KxJo/n7PQecjEY6aEA5ICBGkE8rZrypMIZKDjigOSjkOSB0OBkRxUKznGRJCDn7Ohz+5Yv3MwY8Qk0m9vG00yNtKg4N/0GD/HCJWTwcgk0D+KBNPvetfJKB8naL7jHxMw4YNee655+jevTt5eXkEBAQwfvz4cxb9SpUqMXbsWLp06XL6QG6/fv0AePrpp2nXrh2RkZGnu5Lg3H368fHxbNq0iePHjxMTE8OUKVPo0aPHBeU/YsQIhg8fTpMmTfD392fatGkEBQXRoUMHatSoQcOGDWnQoAEtWrS4yE/GM4kx5vxzFaNWrVoZX7mJypY3+lMtZSlzW82kRqPWNKlSmrCgErAdPnkcjh+wLhLLOAIZh8k+nkJy8n5SDx0g/dgRMhxhnPArRbpfKefP0qd/HvcrTY7DTQeJjSEqew/VMjZS+dh62hxdSLBkkxN3C0HdHoWIiu6JUww2btxIgwYN7E5DeYCCvgsikmiMOe9FCCWgwninjPWfUzf1R+aWG8L1V/ayOx33Cgq3HvkEAJWdj+LXHOgDwJe/JHHk6+e5PmkmeRs+xtFuBHS4D4JL25KZUsXNg/oNfEhmGnlfPsjvedWp0e8Ru7PxKVe2j6P24In051UW5baAn1+G15tZ10Zk65DFquRzqeiLSKSIzBGRTSKyUUTanTFdROQNEflDRNaJSMnoFHNR7rfPEJyVwgcVHiSu+nnvY6zcrF2tcrwxciBjQ0fTP2cMByMawqLH4c2W1pAXSpVgrrb0XwcWGmPqA82AjWdM7wXUcT6GAm+7GM/77VyBI3Eq03J60KP7FXZn47NqRofz2YgOBMY0p/XOkcxt8jYmIARm9IOV71qniSpVAhW66ItIaeBSYAqAMSbLGHPkjNn6ATOM5VcgUkQqFTpbb5dzEvPlvRyUKBZE307H2lF2Z+TTyoYFMnNIa65qXoX7V5XmsajXyK3VDRaMgi/utk4pVaqEcaWlXwNIBt4TkTUiMllEzhyusQqwK9/z3c7X/kFEhopIgogkJCcnu5CSh1v6GpK8iYdPDua2Lo11bHQPEOTvxyvXNuOBy+vywdo0bjh2Hxlt74c178O03nB0n90pKuVWrhR9f6AF8LYxpjlwAijUUUljzCRjTCtjTKtTl1+XOMmbMT+/xJLAS9lepgO9GvvuDo+nERHu7VaH1wfFsWbXUa7Y0JkDPSfBgd9hUmfYtcruFD2Gn58fcXFxNG7cmGuuuYb09PSLev+QIUP4/fffL3j+adOmcffdd593vp49exIZGUmfPn3+8frgwYOpUaMGcXFxxMXF/etq4ovx5JNP8t133xXqvUeOHGHChAmFju1OrhT93cBuY8wK5/M5WBuB/PYAVfM9j3G+5lvy8uDL/yPHL4QHjl7PXZfWwk9HrPQ4/eKq8MGdbUjLyKbHojKs6znbGtZh2hWweqbd6XmEU8MwbNiwgcDAQCZOnHjB7z01tPKFjqV/MUaPHs3MmQX/jcaNG0dSUhJJSUn/uNjrYj377LNcdtllhXqvJxX9Qp+nb4zZLyK7RKSeMWYz0A04cxP+BXC3iHwEtAHSjDG+t7+8ejrs/IX3yjyImPIMaPGvHi7lIVrFlmXuiPbcNm0VAz9L49UrP6DP5v9YffwHfoMeL1z4PQ2K0tePwP717l1mxSbQa+wFz+6NQysXZNq0acybN48TJ06wdetWRo0aRVZWFjNnziQoKIgFCxZQtmxZBg8eTJ8+fbj66quJjY3l1ltv5csvvyQ7O5vZs2dTv359nn76acLDwxk1ahQAjRs3Zv78+TzyyCNs27aNuLg4Lr/8csaNG8e4ceP45JNPOHnyJFdddRXPPPMMJ06c4Nprr2X37t3k5ubyxBNPcN111xVqvc7G1W/vPcAsEVkHxAEviMgwERnmnL4A+BP4A3gXGOFiPO9zbD98+xTHK7XnhX0tuKNjDb1BiYerXi6MucM70Kp6We6e9xevVhyDaTMMVrwN8//P2nPzcaeGVm7SpMk/hlZOSkrCz8+PWbNmAX8PQbx27dp/jDl/amjlH374gaSkJFatWsW8efPYt28fTz31FMuWLWPp0qX/6Ar64osvePLJJy8618cee4ymTZty//33c/JkwQfnN2zYwGeffcaqVat47LHHCA0NZc2aNbRr144ZM2YU+J6oqChWr17N8OHDeemll86Zw9ixY6lVqxZJSUmMGzeORYsWsXXrVlauXElSUhKJiYksWbKEhQsXUrlyZdauXcuGDRvo2bPnRa/v+bh0Ra4xJgk487LfifmmG2CkKzG83jePQU4mLwUOJyI4gBvbVLM7I3UBSocGMP321jw+bz2v/7iD7U2v45UOYfgve9m69/CVb9jb4r+IFrk7edvQymPGjKFixYpkZWUxdOhQXnzxxQI3HF26dCEiIoKIiAhKly7NlVdeCUCTJk1O782cKf8wzZ999tlF5bVo0SIWLVp0+l4Bx48fZ+vWrcTHx/Pggw/y8MMP06dPH+Lj4y9quRdCh2EoSslbYMOnHGl5N9N/8WN4p+ruGwJZFblAfwcvDmxKjahwXly4iT3VujGzrSH011eswt/3TeteBD7E24ZWrlTJOmEiKCiI22677awt8vxdSA6H4/Rzh8Nx1iGYCxqm+VzDMednjOHRRx/lrrvu+te01atXs2DBAh5//HG6detWqL2bc/GAzskSbNnr4B/MWxmXE+Dn4LYONezOSF0kEWF451pMuLEFG/Yepce6eFIueQCSZsHnI627jvm4bt26MWfOHA4ePAhAamoqf/311znf07p1a3766ScOHTpEbm4uH374IZ06daJNmzb89NNPpKSknO4rd8W+fdYhRGMM8+bNo3Hjxi4t73xiY2NZvXo1YBXv7du3AxAREcGxY8dOz9ejRw+mTp3K8ePWkOF79uzh4MGD7N27l9DQUG666SZGjx59elnupC39onJkF6z7iBPNbmPGynSuvSSG6Ai9vaC3uqJJJSqVDubOGQl0XtWWr5r+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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "temp_series.plot(label=\"Period: 1 hour\")\n", "temp_series_freq_15min.plot(label=\"Period: 15 minutes\")\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Múi giờ\n", "Theo mặc định, thời gian dữ liệu là *sơ khai*: chúng không biết múi giờ, vì vậy 2016-10-30 02:30 có thể có nghĩa là ngày 30 tháng 10 năm 2016 lúc 2:30 sáng ở Paris hoặc ở New York. Chúng ta có thể chỉ định múi giờ bằng cách gọi phương thức `tz_localize()`:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 17:30:00-04:00 4.4\n", "2016-10-29 18:30:00-04:00 5.1\n", "2016-10-29 19:30:00-04:00 6.1\n", "2016-10-29 20:30:00-04:00 6.2\n", "2016-10-29 21:30:00-04:00 6.1\n", "2016-10-29 22:30:00-04:00 6.1\n", "2016-10-29 23:30:00-04:00 5.7\n", "2016-10-30 00:30:00-04:00 5.2\n", "2016-10-30 01:30:00-04:00 4.7\n", "2016-10-30 02:30:00-04:00 4.1\n", "2016-10-30 03:30:00-04:00 3.9\n", "2016-10-30 04:30:00-04:00 3.5\n", "Freq: H, dtype: float64" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_ny = temp_series.tz_localize(\"America/New_York\")\n", "temp_series_ny" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng `-04:00` hiện được thêm vào tất cả các mốc thời gian. Điều này có nghĩa là các mốc thời gian này đề cập đến [UTC](https://en.wikipedia.org/wiki/Coordined_Universal_Time) - 4 giờ.\n", "\n", "Chúng ta có thể chuyển đổi các ngày giờ này sang giờ Paris như sau:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 23:30:00+02:00 4.4\n", "2016-10-30 00:30:00+02:00 5.1\n", "2016-10-30 01:30:00+02:00 6.1\n", "2016-10-30 02:30:00+02:00 6.2\n", "2016-10-30 02:30:00+01:00 6.1\n", "2016-10-30 03:30:00+01:00 6.1\n", "2016-10-30 04:30:00+01:00 5.7\n", "2016-10-30 05:30:00+01:00 5.2\n", "2016-10-30 06:30:00+01:00 4.7\n", "2016-10-30 07:30:00+01:00 4.1\n", "2016-10-30 08:30:00+01:00 3.9\n", "2016-10-30 09:30:00+01:00 3.5\n", "Freq: H, dtype: float64" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_paris = temp_series_ny.tz_convert(\"Europe/Paris\")\n", "temp_series_paris" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể nhận thấy rằng phần bù UTC thay đổi từ `+02:00` thành `+01:00`: điều này là do Pháp chuyển sang giờ mùa đông lúc 3 giờ sáng vào đêm cụ thể đó (thời gian quay trở lại 2 giờ sáng). Lưu ý rằng 2:30 sáng xảy ra hai lần! Hãy quay lại với một biểu diễn sơ khai (nếu bạn ghi nhật ký một số dữ liệu hàng giờ bằng giờ địa phương mà không lưu trữ múi giờ, bạn có thể nhận được kết quả như sau):" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 23:30:00 4.4\n", "2016-10-30 00:30:00 5.1\n", "2016-10-30 01:30:00 6.1\n", "2016-10-30 02:30:00 6.2\n", "2016-10-30 02:30:00 6.1\n", "2016-10-30 03:30:00 6.1\n", "2016-10-30 04:30:00 5.7\n", "2016-10-30 05:30:00 5.2\n", "2016-10-30 06:30:00 4.7\n", "2016-10-30 07:30:00 4.1\n", "2016-10-30 08:30:00 3.9\n", "2016-10-30 09:30:00 3.5\n", "Freq: H, dtype: float64" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_paris_naive = temp_series_paris.tz_localize(None)\n", "temp_series_paris_naive" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ `02:30` thực sự mơ hồ. Nếu chúng ta cố gắng bản địa hóa những ngày giờ sơ khai này sang múi giờ Paris, ta sẽ gặp lỗi:" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Cannot infer dst time from Timestamp('2016-10-30 02:30:00'), try using the 'ambiguous' argument\n" ] } ], "source": [ "try:\n", " temp_series_paris_naive.tz_localize(\"Europe/Paris\")\n", "except Exception as e:\n", " print(type(e))\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "May mắn thay, bằng cách sử dụng đối số `ambiguous`, chúng ta có thể yêu cầu pandas suy ra đúng DST (Daylight Saving Time) dựa trên thứ tự của các dấu thời gian mơ hồ:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-10-29 23:30:00+02:00 4.4\n", "2016-10-30 00:30:00+02:00 5.1\n", "2016-10-30 01:30:00+02:00 6.1\n", "2016-10-30 02:30:00+02:00 6.2\n", "2016-10-30 02:30:00+01:00 6.1\n", "2016-10-30 03:30:00+01:00 6.1\n", "2016-10-30 04:30:00+01:00 5.7\n", "2016-10-30 05:30:00+01:00 5.2\n", "2016-10-30 06:30:00+01:00 4.7\n", "2016-10-30 07:30:00+01:00 4.1\n", "2016-10-30 08:30:00+01:00 3.9\n", "2016-10-30 09:30:00+01:00 3.5\n", "Freq: H, dtype: float64" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp_series_paris_naive.tz_localize(\"Europe/Paris\", ambiguous=\"infer\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Chu kỳ\n", "Hàm `pd.period_range()` trả về `PeriodIndex` thay vì `DatetimeIndex`. Ví dụ: hãy lấy tất cả các quý trong năm 2016 và 2017:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2016Q1', '2016Q2', '2016Q3', '2016Q4', '2017Q1', '2017Q2',\n", " '2017Q3', '2017Q4'],\n", " dtype='period[Q-DEC]', freq='Q-DEC')" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quarters = pd.period_range('2016Q1', periods=8, freq='Q')\n", "quarters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Việc thêm một số `N` vào `PeriodIndex` sẽ dịch chuyển các khoảng thời gian bằng `N` lần tần suất của `PeriodIndex`:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2016Q4', '2017Q1', '2017Q2', '2017Q3', '2017Q4', '2018Q1',\n", " '2018Q2', '2018Q3'],\n", " dtype='period[Q-DEC]', freq='Q-DEC')" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quarters + 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Phương thức `asfreq()` cho phép chúng ta thay đổi tần số của `PeriodIndex`. Tất cả các giai đoạn được kéo dài hoặc rút ngắn cho phù hợp. Ví dụ: hãy chuyển đổi tất cả các khoảng thời gian hàng quý thành khoảng thời gian hàng tháng (phóng đại):" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2016-03', '2016-06', '2016-09', '2016-12', '2017-03', '2017-06',\n", " '2017-09', '2017-12'],\n", " dtype='period[M]', freq='M')" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quarters.asfreq(\"M\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Theo mặc định, `asfreq` phóng đại vào cuối mỗi khoảng thời gian. Thay vào đó, chúng ta có thể yêu cầu nó phóng đại vào đầu mỗi khoảng thời gian:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2016-01', '2016-04', '2016-07', '2016-10', '2017-01', '2017-04',\n", " '2017-07', '2017-10'],\n", " dtype='period[M]', freq='M')" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quarters.asfreq(\"M\", how=\"start\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Và chúng ta có thể thu nhỏ:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2016', '2016', '2016', '2016', '2017', '2017', '2017', '2017'], dtype='period[A-DEC]', freq='A-DEC')" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quarters.asfreq(\"A\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tất nhiên chúng ta có thể tạo `Series` với `PeriodIndex`:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016Q1 300\n", "2016Q2 320\n", "2016Q3 290\n", "2016Q4 390\n", "2017Q1 320\n", "2017Q2 360\n", "2017Q3 310\n", "2017Q4 410\n", "Freq: Q-DEC, dtype: int64" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "quarterly_revenue = pd.Series([300, 320, 290, 390, 320, 360, 310, 410], index = quarters)\n", "quarterly_revenue" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "quarterly_revenue.plot(kind=\"line\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chúng ta có thể chuyển đổi các khoảng thời gian thành mốc thời gian bằng cách gọi `to_timestamp`. Theo mặc định, điều này sẽ cung cấp cho chúng ta ngày đầu tiên của mỗi khoảng thời gian, nhưng bằng cách đặt `how` và `freq`, chúng ta có thể nhận được giờ cuối cùng của mỗi khoảng thời gian:" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016-03-31 23:00:00 300\n", "2016-06-30 23:00:00 320\n", "2016-09-30 23:00:00 290\n", "2016-12-31 23:00:00 390\n", "2017-03-31 23:00:00 320\n", "2017-06-30 23:00:00 360\n", "2017-09-30 23:00:00 310\n", "2017-12-31 23:00:00 410\n", "Freq: Q-DEC, dtype: int64" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "last_hours = quarterly_revenue.to_timestamp(how=\"end\", freq=\"H\")\n", "last_hours" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Và quay lại thời gian bằng cách gọi `to_period`:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2016Q1 300\n", "2016Q2 320\n", "2016Q3 290\n", "2016Q4 390\n", "2017Q1 320\n", "2017Q2 360\n", "2017Q3 310\n", "2017Q4 410\n", "Freq: Q-DEC, dtype: int64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "last_hours.to_period()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas cũng cung cấp nhiều chức năng khác liên quan đến thời gian mà chúng tôi khuyên bạn nên xem trong [tài liệu](http://pandas.pydata.org/pandas-docs/stable/timeseries.html). Để kích thích sự tò mò của bạn, đây là một cách để có được ngày làm việc cuối cùng của mỗi tháng trong năm 2016, lúc 9 giờ sáng:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2016-01-29 09:00', '2016-02-29 09:00', '2016-03-31 09:00',\n", " '2016-04-29 09:00', '2016-05-31 09:00', '2016-06-30 09:00',\n", " '2016-07-29 09:00', '2016-08-31 09:00', '2016-09-30 09:00',\n", " '2016-10-31 09:00', '2016-11-30 09:00', '2016-12-30 09:00'],\n", " dtype='period[H]', freq='H')" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "months_2016 = pd.period_range(\"2016\", periods=12, freq=\"M\")\n", "one_day_after_last_days = months_2016.asfreq(\"D\") + 1\n", "last_bdays = one_day_after_last_days.to_timestamp() - pd.tseries.offsets.BDay()\n", "last_bdays.to_period(\"H\") + 9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Đối tượng `DataFrame`\n", "Một đối tượng DataFrame đại diện cho một bảng tính, với các giá trị ô, tên cột và nhãn chỉ mục hàng. Bạn có thể xác định các biểu thức để tính toán cột dựa trên các cột khác, tạo bảng tổng hợp, nhóm hàng, vẽ biểu đồ, v.v. Bạn có thể xem `DataFrame` là từ điển của `Series`.\n", "\n", "## Tạo `DataFrame`\n", "Bạn có thể tạo DataFrame bằng cách chuyển từ điển các đối tượng `Series`:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843.0Dancing83
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3.0 Dancing 83\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people_dict = {\n", " \"weight\": pd.Series([68, 83, 112], index=[\"alice\", \"bob\", \"charles\"]),\n", " \"birthyear\": pd.Series([1984, 1985, 1992], index=[\"bob\", \"alice\", \"charles\"], name=\"year\"),\n", " \"children\": pd.Series([0, 3], index=[\"charles\", \"bob\"]),\n", " \"hobby\": pd.Series([\"Biking\", \"Dancing\"], index=[\"alice\", \"bob\"]),\n", "}\n", "people = pd.DataFrame(people_dict)\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Một số điều cần lưu ý:\n", "* `Series` được căn chỉnh tự động dựa trên chỉ mục của chúng,\n", "* các giá trị bị thiếu được biểu thị dưới dạng `NaN`,\n", "* Tên `Series` bị bỏ qua (tên `\"year\"` đã bị loại bỏ),\n", "* `DataFrame` được hiển thị rõ ràng trong Jupyter Notebook, tuyệt vời!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể truy cập các cột một cách dễ dàng. Chúng được trả về dưới dạng các đối tượng `Series`:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice 1985\n", "bob 1984\n", "charles 1992\n", "Name: birthyear, dtype: int64" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people[\"birthyear\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn cũng có thể lấy nhiều cột cùng một lúc:" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearhobby
alice1985Biking
bob1984Dancing
charles1992NaN
\n", "
" ], "text/plain": [ " birthyear hobby\n", "alice 1985 Biking\n", "bob 1984 Dancing\n", "charles 1992 NaN" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people[[\"birthyear\", \"hobby\"]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nếu bạn chuyển danh sách các cột và/hoặc nhãn hàng chỉ mục cho hàm tạo `DataFrame`, nó sẽ đảm bảo rằng các cột và/hoặc hàng này sẽ tồn tại, theo thứ tự đó và sẽ không tồn tại cột/hàng nào khác. Ví dụ:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearweightheight
bob1984.083.0NaN
alice1985.068.0NaN
eugeneNaNNaNNaN
\n", "
" ], "text/plain": [ " birthyear weight height\n", "bob 1984.0 83.0 NaN\n", "alice 1985.0 68.0 NaN\n", "eugene NaN NaN NaN" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d2 = pd.DataFrame(\n", " people_dict,\n", " columns=[\"birthyear\", \"weight\", \"height\"],\n", " index=[\"bob\", \"alice\", \"eugene\"]\n", " )\n", "d2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Một cách thuận tiện khác để tạo `DataFrame` là chuyển tất cả các giá trị cho hàm tạo dưới dạng `ndarray` hoặc danh sách các danh sách và chỉ định riêng tên cột và nhãn chỉ mục hàng:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843.0Dancing83
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3.0 Dancing 83\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "values = [\n", " [1985, np.nan, \"Biking\", 68],\n", " [1984, 3, \"Dancing\", 83],\n", " [1992, 0, np.nan, 112]\n", " ]\n", "d3 = pd.DataFrame(\n", " values,\n", " columns=[\"birthyear\", \"children\", \"hobby\", \"weight\"],\n", " index=[\"alice\", \"bob\", \"charles\"]\n", " )\n", "d3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Để chỉ định các giá trị bị thiếu, bạn có thể sử dụng các mảng được che dấu của `np.nan` hoặc NumPy:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843Dancing83
charles19920NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3 Dancing 83\n", "charles 1992 0 NaN 112" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "masked_array = np.ma.asarray(values, dtype=np.object)\n", "masked_array[(0, 2), (1, 2)] = np.ma.masked\n", "d3 = pd.DataFrame(\n", " masked_array,\n", " columns=[\"birthyear\", \"children\", \"hobby\", \"weight\"],\n", " index=[\"alice\", \"bob\", \"charles\"]\n", " )\n", "d3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thay vì `ndarray`, bạn cũng có thể truyền đối tượng `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbychildren
aliceBikingNaN
bobDancing3
\n", "
" ], "text/plain": [ " hobby children\n", "alice Biking NaN\n", "bob Dancing 3" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d4 = pd.DataFrame(\n", " d3,\n", " columns=[\"hobby\", \"children\"],\n", " index=[\"alice\", \"bob\"]\n", " )\n", "d4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cũng có thể tạo `DataFrame` bằng từ điển (hoặc danh sách) lồng trong từ điển (hoặc danh sách):" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843.0Dancing83
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3.0 Dancing 83\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people = pd.DataFrame({\n", " \"birthyear\": {\"alice\":1985, \"bob\": 1984, \"charles\": 1992},\n", " \"hobby\": {\"alice\":\"Biking\", \"bob\": \"Dancing\"},\n", " \"weight\": {\"alice\":68, \"bob\": 83, \"charles\": 112},\n", " \"children\": {\"bob\": 3, \"charles\": 0}\n", "})\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Đa chỉ mục\n", "Nếu tất cả các cột là các tuple có cùng kích thước, thì chúng được hiểu là đa chỉ mục. Điều tương tự cũng xảy ra với nhãn chỉ mục hàng. Ví dụ:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
privatepublic
childrenweightbirthyearhobby
Londoncharles0.01121992NaN
ParisaliceNaN681985Biking
bob3.0831984Dancing
\n", "
" ], "text/plain": [ " private public \n", " children weight birthyear hobby\n", "London charles 0.0 112 1992 NaN\n", "Paris alice NaN 68 1985 Biking\n", " bob 3.0 83 1984 Dancing" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d5 = pd.DataFrame(\n", " {\n", " (\"public\", \"birthyear\"):\n", " {(\"Paris\",\"alice\"):1985, (\"Paris\",\"bob\"): 1984, (\"London\",\"charles\"): 1992},\n", " (\"public\", \"hobby\"):\n", " {(\"Paris\",\"alice\"):\"Biking\", (\"Paris\",\"bob\"): \"Dancing\"},\n", " (\"private\", \"weight\"):\n", " {(\"Paris\",\"alice\"):68, (\"Paris\",\"bob\"): 83, (\"London\",\"charles\"): 112},\n", " (\"private\", \"children\"):\n", " {(\"Paris\", \"alice\"):np.nan, (\"Paris\",\"bob\"): 3, (\"London\",\"charles\"): 0}\n", " }\n", ")\n", "d5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Giờ đây, bạn có thể nhận được một `DataFrame` chứa tất cả các cột `\"public\"` một cách dễ dàng:" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearhobby
Londoncharles1992NaN
Parisalice1985Biking
bob1984Dancing
\n", "
" ], "text/plain": [ " birthyear hobby\n", "London charles 1992 NaN\n", "Paris alice 1985 Biking\n", " bob 1984 Dancing" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d5[\"public\"]" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "London charles NaN\n", "Paris alice Biking\n", " bob Dancing\n", "Name: (public, hobby), dtype: object" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d5[\"public\", \"hobby\"] # Same result as d5[\"public\"][\"hobby\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hạ cấp\n", "Hãy xem lại `d5`:" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
privatepublic
childrenweightbirthyearhobby
Londoncharles0.01121992NaN
ParisaliceNaN681985Biking
bob3.0831984Dancing
\n", "
" ], "text/plain": [ " private public \n", " children weight birthyear hobby\n", "London charles 0.0 112 1992 NaN\n", "Paris alice NaN 68 1985 Biking\n", " bob 3.0 83 1984 Dancing" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Có hai cấp độ cột và hai cấp độ chỉ mục. Chúng ta có thể giảm cấp độ cột bằng cách gọi `droplevel()` (tương tự với các chỉ mục):" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
childrenweightbirthyearhobby
Londoncharles0.01121992NaN
ParisaliceNaN681985Biking
bob3.0831984Dancing
\n", "
" ], "text/plain": [ " children weight birthyear hobby\n", "London charles 0.0 112 1992 NaN\n", "Paris alice NaN 68 1985 Biking\n", " bob 3.0 83 1984 Dancing" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d5.columns = d5.columns.droplevel(level = 0)\n", "d5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Chuyển vị\n", "Bạn có thể hoán đổi các cột và chỉ mục bằng thuộc tính `T`:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LondonParis
charlesalicebob
children0NaN3
weight1126883
birthyear199219851984
hobbyNaNBikingDancing
\n", "
" ], "text/plain": [ " London Paris \n", " charles alice bob\n", "children 0 NaN 3\n", "weight 112 68 83\n", "birthyear 1992 1985 1984\n", "hobby NaN Biking Dancing" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d6 = d5.T\n", "d6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Xếp chồng và gỡ chồng\n", "Gọi phương thức `stack()` sẽ đẩy cột thấp nhất vào sau chỉ mục thấp nhất:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LondonParis
childrenbobNaN3
charles0NaN
weightaliceNaN68
bobNaN83
charles112NaN
birthyearaliceNaN1985
bobNaN1984
charles1992NaN
hobbyaliceNaNBiking
bobNaNDancing
\n", "
" ], "text/plain": [ " London Paris\n", "children bob NaN 3\n", " charles 0 NaN\n", "weight alice NaN 68\n", " bob NaN 83\n", " charles 112 NaN\n", "birthyear alice NaN 1985\n", " bob NaN 1984\n", " charles 1992 NaN\n", "hobby alice NaN Biking\n", " bob NaN Dancing" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d7 = d6.stack()\n", "d7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng nhiều giá trị `NaN` đã xuất hiện. Điều này có ý nghĩa bởi vì nhiều kết hợp mới không tồn tại trước đây (ví dụ: không có `bob` trong `London`).\n", "\n", "Việc gọi `unstack()` sẽ làm ngược lại, một lần nữa tạo ra nhiều giá trị `NaN`." ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LondonParis
alicebobcharlesalicebobcharles
childrenNoneNaN0None3NaN
weightNaNNaN1126883NaN
birthyearNaNNaN199219851984NaN
hobbyNaNNaNNoneBikingDancingNone
\n", "
" ], "text/plain": [ " London Paris \n", " alice bob charles alice bob charles\n", "children None NaN 0 None 3 NaN\n", "weight NaN NaN 112 68 83 NaN\n", "birthyear NaN NaN 1992 1985 1984 NaN\n", "hobby NaN NaN None Biking Dancing None" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d8 = d7.unstack()\n", "d8" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nếu chúng ta gọi lại `unstack`, chúng ta sẽ có một đối tượng `Series`:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "London alice children None\n", " weight NaN\n", " birthyear NaN\n", " hobby NaN\n", " bob children NaN\n", " weight NaN\n", " birthyear NaN\n", " hobby NaN\n", " charles children 0\n", " weight 112\n", " birthyear 1992\n", " hobby None\n", "Paris alice children None\n", " weight 68\n", " birthyear 1985\n", " hobby Biking\n", " bob children 3\n", " weight 83\n", " birthyear 1984\n", " hobby Dancing\n", " charles children NaN\n", " weight NaN\n", " birthyear NaN\n", " hobby None\n", "dtype: object" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d9 = d8.unstack()\n", "d9" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Các phương thức `stack()` và `unstack()` cho phép bạn chọn `level` để xếp chồng/gỡ chồng. Bạn thậm chí có thể xếp chồng/gỡ chồng nhiều cấp độ cùng một lúc:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LondonParis
alicebobcharlesalicebobcharles
childrenNoneNaN0None3NaN
weightNaNNaN1126883NaN
birthyearNaNNaN199219851984NaN
hobbyNaNNaNNoneBikingDancingNone
\n", "
" ], "text/plain": [ " London Paris \n", " alice bob charles alice bob charles\n", "children None NaN 0 None 3 NaN\n", "weight NaN NaN 112 68 83 NaN\n", "birthyear NaN NaN 1992 1985 1984 NaN\n", "hobby NaN NaN None Biking Dancing None" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d10 = d9.unstack(level = (0,1))\n", "d10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hầu hết các phương thức trả về các bản sao đã sửa đổi\n", "Như bạn có thể nhận thấy, các phương thức `stack()` và `unstack()` không sửa đổi đối tượng mà chúng áp dụng. Thay vào đó, chúng làm việc trên một bản sao và trả lại bản sao đó. Điều này đúng với hầu hết các phương thức trong pandas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Truy cập hàng\n", "Hãy quay lại `DataFrame` `people`:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843.0Dancing83
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3.0 Dancing 83\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thuộc tính `loc` cho phép bạn truy cập các hàng thay vì các cột. Kết quả là một đối tượng `Series` trong đó tên cột của `DataFrame` được ánh xạ tới nhãn chỉ mục hàng:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "birthyear 1992\n", "children 0\n", "hobby NaN\n", "weight 112\n", "Name: charles, dtype: object" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.loc[\"charles\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn cũng có thể truy cập các hàng theo vị trí số nguyên bằng thuộc tính `iloc`:" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "birthyear 1992\n", "children 0\n", "hobby NaN\n", "weight 112\n", "Name: charles, dtype: object" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.iloc[2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn cũng có thể lấy một lát hàng và điều này trả về một đối tượng `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
bob19843.0Dancing83
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "bob 1984 3.0 Dancing 83\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.iloc[1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cuối cùng, bạn có thể chuyển một mảng boolean để nhận các hàng phù hợp:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people[np.array([True, False, True])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Điều này hữu ích nhất khi được kết hợp với các biểu thức boolean:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843.0Dancing83
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3.0 Dancing 83" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people[people[\"birthyear\"] < 1990]" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Thêm, bớt cột\n", "Nhìn chung, bạn có thể xem các đối tượng `DataFrame` giống như từ điển của `Series`:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
birthyearchildrenhobbyweight
alice1985NaNBiking68
bob19843.0Dancing83
charles19920.0NaN112
\n", "
" ], "text/plain": [ " birthyear children hobby weight\n", "alice 1985 NaN Biking 68\n", "bob 1984 3.0 Dancing 83\n", "charles 1992 0.0 NaN 112" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyweightageover 30
aliceBiking6833True
bobDancing8334True
charlesNaN11226False
\n", "
" ], "text/plain": [ " hobby weight age over 30\n", "alice Biking 68 33 True\n", "bob Dancing 83 34 True\n", "charles NaN 112 26 False" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people[\"age\"] = 2018 - people[\"birthyear\"] # adds a new column \"age\"\n", "people[\"over 30\"] = people[\"age\"] > 30 # adds another column \"over 30\"\n", "birthyears = people.pop(\"birthyear\")\n", "del people[\"children\"]\n", "\n", "people" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice 1985\n", "bob 1984\n", "charles 1992\n", "Name: birthyear, dtype: int64" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "birthyears" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Khi bạn thêm một cột mới, cột đó phải có cùng số hàng. Các hàng bị thiếu được lấp đầy bằng `NaN` và các hàng thừa sẽ bị bỏ qua:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyweightageover 30pets
aliceBiking6833TrueNaN
bobDancing8334True0.0
charlesNaN11226False5.0
\n", "
" ], "text/plain": [ " hobby weight age over 30 pets\n", "alice Biking 68 33 True NaN\n", "bob Dancing 83 34 True 0.0\n", "charles NaN 112 26 False 5.0" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people[\"pets\"] = pd.Series({\"bob\": 0, \"charles\": 5, \"eugene\":1}) # alice is missing, eugene is ignored\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Khi thêm một cột mới, nó sẽ được thêm vào cuối (ở bên phải) theo mặc định. Bạn cũng có thể chèn một cột vào bất kỳ nơi nào khác bằng phương thức `insert()`:" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30pets
aliceBiking1726833TrueNaN
bobDancing1818334True0.0
charlesNaN18511226False5.0
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets\n", "alice Biking 172 68 33 True NaN\n", "bob Dancing 181 83 34 True 0.0\n", "charles NaN 185 112 26 False 5.0" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.insert(1, \"height\", [172, 181, 185])\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gán cột mới\n", "Bạn cũng có thể tạo các cột mới bằng cách gọi phương thức `assign()`. Lưu ý rằng điều này trả về một đối tượng `DataFrame` mới, bản gốc không được sửa đổi:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_indexhas_pets
aliceBiking1726833TrueNaN22.985398False
bobDancing1818334True0.025.335002False
charlesNaN18511226False5.032.724617True
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index \\\n", "alice Biking 172 68 33 True NaN 22.985398 \n", "bob Dancing 181 83 34 True 0.0 25.335002 \n", "charles NaN 185 112 26 False 5.0 32.724617 \n", "\n", " has_pets \n", "alice False \n", "bob False \n", "charles True " ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.assign(\n", " body_mass_index = people[\"weight\"] / (people[\"height\"] / 100) ** 2,\n", " has_pets = people[\"pets\"] > 0\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng bạn không thể truy cập các cột được tạo trong cùng một tác vụ:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Key error: 'body_mass_index'\n" ] } ], "source": [ "try:\n", " people.assign(\n", " body_mass_index = people[\"weight\"] / (people[\"height\"] / 100) ** 2,\n", " overweight = people[\"body_mass_index\"] > 25\n", " )\n", "except KeyError as e:\n", " print(\"Key error:\", e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Giải pháp là chia tác vụ này thành hai tác vụ liên tiếp:" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_indexoverweight
aliceBiking1726833TrueNaN22.985398False
bobDancing1818334True0.025.335002True
charlesNaN18511226False5.032.724617True
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index \\\n", "alice Biking 172 68 33 True NaN 22.985398 \n", "bob Dancing 181 83 34 True 0.0 25.335002 \n", "charles NaN 185 112 26 False 5.0 32.724617 \n", "\n", " overweight \n", "alice False \n", "bob True \n", "charles True " ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d6 = people.assign(body_mass_index = people[\"weight\"] / (people[\"height\"] / 100) ** 2)\n", "d6.assign(overweight = d6[\"body_mass_index\"] > 25)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Việc phải tạo một biến tạm thời `d6` không thuận tiện lắm. Bạn có thể chỉ muốn tạo một chuỗi các lệnh gọi phân công, nhưng điều này không khả thi vì đối tượng `people` không thực sự được sửa đổi bởi phép gán đầu tiên:" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Key error: 'body_mass_index'\n" ] } ], "source": [ "try:\n", " (people\n", " .assign(body_mass_index = people[\"weight\"] / (people[\"height\"] / 100) ** 2)\n", " .assign(overweight = people[\"body_mass_index\"] > 25)\n", " )\n", "except KeyError as e:\n", " print(\"Key error:\", e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nhưng đừng lo, có một giải pháp đơn giản. Bạn có thể chuyển một hàm cho phương thức `assign()` (thường là hàm `lambda`) và hàm này sẽ được gọi với `DataFrame` làm tham số:" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_indexoverweight
aliceBiking1726833TrueNaN22.985398False
bobDancing1818334True0.025.335002True
charlesNaN18511226False5.032.724617True
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index \\\n", "alice Biking 172 68 33 True NaN 22.985398 \n", "bob Dancing 181 83 34 True 0.0 25.335002 \n", "charles NaN 185 112 26 False 5.0 32.724617 \n", "\n", " overweight \n", "alice False \n", "bob True \n", "charles True " ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(people\n", " .assign(body_mass_index = lambda df: df[\"weight\"] / (df[\"height\"] / 100) ** 2)\n", " .assign(overweight = lambda df: df[\"body_mass_index\"] > 25)\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vấn đề đã được giải quyết!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Đánh giá một biểu thức\n", "Một tính năng tuyệt vời được hỗ trợ bởi pandas là đánh giá biểu thức. Điều này yêu cầu thư viện `numexpr` phải được cài đặt." ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice False\n", "bob True\n", "charles True\n", "dtype: bool" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.eval(\"weight / (height/100) ** 2 > 25\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Biểu thức gán cũng được hỗ trợ. Hãy đặt `inplace=True` để sửa đổi trực tiếp `DataFrame` thay vì lấy một bản sao đã sửa đổi:" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_index
aliceBiking1726833TrueNaN22.985398
bobDancing1818334True0.025.335002
charlesNaN18511226False5.032.724617
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index\n", "alice Biking 172 68 33 True NaN 22.985398\n", "bob Dancing 181 83 34 True 0.0 25.335002\n", "charles NaN 185 112 26 False 5.0 32.724617" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.eval(\"body_mass_index = weight / (height/100) ** 2\", inplace=True)\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể sử dụng một biến cục bộ hoặc biến toàn cục trong một biểu thức bằng cách đặt trước nó `'@'`:" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_indexoverweight
aliceBiking1726833TrueNaN22.985398False
bobDancing1818334True0.025.335002False
charlesNaN18511226False5.032.724617True
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index \\\n", "alice Biking 172 68 33 True NaN 22.985398 \n", "bob Dancing 181 83 34 True 0.0 25.335002 \n", "charles NaN 185 112 26 False 5.0 32.724617 \n", "\n", " overweight \n", "alice False \n", "bob False \n", "charles True " ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "overweight_threshold = 30\n", "people.eval(\"overweight = body_mass_index > @overweight_threshold\", inplace=True)\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Truy vấn `DataFrame`\n", "Phương thức `query()` cho phép bạn lọc `DataFrame` dựa trên biểu thức truy vấn:" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_indexoverweight
bobDancing1818334True0.025.335002False
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index overweight\n", "bob Dancing 181 83 34 True 0.0 25.335002 False" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.query(\"age > 30 and pets == 0\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sắp xếp `DataFrame`\n", "Bạn có thể sắp xếp `DataFrame` bằng cách gọi phương thức `sort_index` của nó. Theo mặc định, nó sắp xếp các hàng theo nhãn chỉ mục của chúng, theo thứ tự tăng dần, nhưng hãy đảo ngược thứ tự:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyheightweightageover 30petsbody_mass_indexoverweight
charlesNaN18511226False5.032.724617True
bobDancing1818334True0.025.335002False
aliceBiking1726833TrueNaN22.985398False
\n", "
" ], "text/plain": [ " hobby height weight age over 30 pets body_mass_index \\\n", "charles NaN 185 112 26 False 5.0 32.724617 \n", "bob Dancing 181 83 34 True 0.0 25.335002 \n", "alice Biking 172 68 33 True NaN 22.985398 \n", "\n", " overweight \n", "charles True \n", "bob False \n", "alice False " ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.sort_index(ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng `sort_index` đã trả về một *bản sao* đã được sắp xếp của `DataFrame`. Để trực tiếp sửa đổi `people`, chúng ta có thể đặt đối số `inplace` thành `True`. Ngoài ra, chúng ta có thể sắp xếp các cột thay vì các hàng bằng cách đặt `axis=1`:" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agebody_mass_indexheighthobbyover 30overweightpetsweight
alice3322.985398172BikingTrueFalseNaN68
bob3425.335002181DancingTrueFalse0.083
charles2632.724617185NaNFalseTrue5.0112
\n", "
" ], "text/plain": [ " age body_mass_index height hobby over 30 overweight pets \\\n", "alice 33 22.985398 172 Biking True False NaN \n", "bob 34 25.335002 181 Dancing True False 0.0 \n", "charles 26 32.724617 185 NaN False True 5.0 \n", "\n", " weight \n", "alice 68 \n", "bob 83 \n", "charles 112 " ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.sort_index(axis=1, inplace=True)\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Để sắp xếp `DataFrame` theo giá trị thay vì nhãn, chúng ta có thể sử dụng `sort_values` và chỉ định cột để sắp xếp theo:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
agebody_mass_indexheighthobbyover 30overweightpetsweight
charles2632.724617185NaNFalseTrue5.0112
alice3322.985398172BikingTrueFalseNaN68
bob3425.335002181DancingTrueFalse0.083
\n", "
" ], "text/plain": [ " age body_mass_index height hobby over 30 overweight pets \\\n", "charles 26 32.724617 185 NaN False True 5.0 \n", "alice 33 22.985398 172 Biking True False NaN \n", "bob 34 25.335002 181 Dancing True False 0.0 \n", "\n", " weight \n", "charles 112 \n", "alice 68 \n", "bob 83 " ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "people.sort_values(by=\"age\", inplace=True)\n", "people" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vẽ đồ thị với `DataFrame`\n", "Giống như đối với `Series`, pandas giúp ta dễ dàng vẽ các biểu đồ đẹp dựa trên `DataFrame`.\n", "\n", "Ví dụ: việc tạo một biểu đồ đường từ dữ liệu của `DataFrame` bằng cách gọi phương thức `plot` của nó là chuyện nhỏ:" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "people.plot(kind = \"line\", x = \"body_mass_index\", y = [\"height\", \"weight\"])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể chuyển các đối số bổ sung được hỗ trợ bởi các hàm của matplotlib. Ví dụ: chúng ta có thể tạo biểu đồ phân tán và chuyển cho nó một danh sách các kích thước bằng cách sử dụng đối số `s` của hàm `scatter()` của matplotlib:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "people.plot(kind = \"scatter\", x = \"height\", y = \"weight\", s=[40, 120, 200])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Một lần nữa, có quá nhiều tùy chọn để liệt kê ở đây: tùy chọn tốt nhất là tham khảo trang [Trực quan hóa](http://pandas.pydata.org/pandas-docs/stable/visualization.html) trong tài liệu của pandas, tìm đồ thị mà bạn quan tâm và xem mã ví dụ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Toán tử trên `DataFrame`\n", "Mặc dù `DataFrame` không cố gắng bắt chước các mảng NumPy, nhưng có một vài điểm tương đồng. Hãy tạo một `DataFrame` để chứng minh điều này:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice889
bob1099
charles482
darwin91010
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 8 8 9\n", "bob 10 9 9\n", "charles 4 8 2\n", "darwin 9 10 10" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades_array = np.array([[8,8,9],[10,9,9],[4, 8, 2], [9, 10, 10]])\n", "grades = pd.DataFrame(grades_array, columns=[\"sep\", \"oct\", \"nov\"], index=[\"alice\",\"bob\",\"charles\",\"darwin\"])\n", "grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể áp dụng các hàm toán học NumPy trên `DataFrame`: hàm được áp dụng cho tất cả các giá trị:" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice2.8284272.8284273.000000
bob3.1622783.0000003.000000
charles2.0000002.8284271.414214
darwin3.0000003.1622783.162278
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 2.828427 2.828427 3.000000\n", "bob 3.162278 3.000000 3.000000\n", "charles 2.000000 2.828427 1.414214\n", "darwin 3.000000 3.162278 3.162278" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(grades)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tương tự, việc thêm một giá trị vào `DataFrame` sẽ thêm giá trị đó vào tất cả các phần tử trong `DataFrame`. Điều này được gọi là *broadcasting*:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice9910
bob111010
charles593
darwin101111
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 9 9 10\n", "bob 11 10 10\n", "charles 5 9 3\n", "darwin 10 11 11" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades + 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tất nhiên, điều này cũng đúng với tất cả các phép toán nhị phân khác, bao gồm phép toán số học (`*`,`/`,`**`...) và phép toán có điều kiện (`>`, `==`...):" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
aliceTrueTrueTrue
bobTrueTrueTrue
charlesFalseTrueFalse
darwinTrueTrueTrue
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice True True True\n", "bob True True True\n", "charles False True False\n", "darwin True True True" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades >= 5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Các hoạt động tổng hợp, chẳng hạn như tính toán `max`, `sum` hoặc `mean` của `DataFrame`, áp dụng cho từng cột và bạn nhận được một đối tượng `Series`:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sep 7.75\n", "oct 8.75\n", "nov 7.50\n", "dtype: float64" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Phương thức `all` cũng là một thao tác tổng hợp: nó kiểm tra xem tất cả các giá trị có phải là `True` hay không. Hãy xem trong những tháng nào tất cả học sinh đạt điểm cao hơn `5`:" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "sep False\n", "oct True\n", "nov False\n", "dtype: bool" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(grades > 5).all()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hầu hết các hàm này đều có tham số `axis` tùy chọn cho phép bạn chỉ định dọc theo trục nào của `DataFrame` mà bạn muốn thao tác được thực thi. Giá trị mặc định là `axis=0`, nghĩa là thao tác được thực hiện theo chiều dọc (trên mỗi cột). Bạn có thể đặt `axis=1` để thực hiện thao tác theo chiều ngang (trên mỗi hàng). Ví dụ: hãy tìm xem học sinh nào có tất cả các điểm lớn hơn `5`:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice True\n", "bob True\n", "charles False\n", "darwin True\n", "dtype: bool" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(grades > 5).all(axis = 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Phương thức `any` trả về `True` nếu bất kỳ giá trị nào là True. Cùng xem ai đạt ít nhất một điểm 10 nào:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "alice False\n", "bob True\n", "charles False\n", "darwin True\n", "dtype: bool" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(grades == 10).any(axis = 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nếu bạn thêm đối tượng `Series` vào `DataFrame` (hoặc thực thi bất kỳ thao tác nhị phân nào khác), pandas sẽ cố gắng broadcast tới tất cả *hàng* trong `DataFrame`. Điều này chỉ hoạt động nếu `Series` có cùng kích thước với các hàng của `DataFrame`. Ví dụ: hãy trừ `giá trị trung bình` của `DataFrame` (một đối tượng `Series`) khỏi `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice0.25-0.751.5
bob2.250.251.5
charles-3.75-0.75-5.5
darwin1.251.252.5
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 0.25 -0.75 1.5\n", "bob 2.25 0.25 1.5\n", "charles -3.75 -0.75 -5.5\n", "darwin 1.25 1.25 2.5" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades - grades.mean() # equivalent to: grades - [7.75, 8.75, 7.50]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chúng ta đã trừ `7,75` cho tất cả các điểm tháng 9, `8,75` cho các điểm tháng 10 và `7,50` cho các điểm tháng 11. Nó tương đương với việc trừ `DataFrame` này:" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice7.758.757.5
bob7.758.757.5
charles7.758.757.5
darwin7.758.757.5
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 7.75 8.75 7.5\n", "bob 7.75 8.75 7.5\n", "charles 7.75 8.75 7.5\n", "darwin 7.75 8.75 7.5" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame([[7.75, 8.75, 7.50]]*4, index=grades.index, columns=grades.columns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nếu bạn muốn trừ đi giá trị trung bình toàn cầu từ mọi cấp độ, đây là một cách để thực hiện:" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice0.00.01.0
bob2.01.01.0
charles-4.00.0-6.0
darwin1.02.02.0
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 0.0 0.0 1.0\n", "bob 2.0 1.0 1.0\n", "charles -4.0 0.0 -6.0\n", "darwin 1.0 2.0 2.0" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades - grades.values.mean() # subtracts the global mean (8.00) from all grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Căn chỉnh tự động\n", "Tương tự như `Series`, khi hoạt động trên nhiều `DataFrame`, pandas sẽ tự động sắp xếp chúng theo nhãn chỉ mục hàng cũng như theo tên cột. Hãy tạo `DataFrame` với điểm thưởng cho mỗi người từ tháng 10 đến tháng 12:" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
octnovdec
bob0.0NaN2.0
colinNaN1.00.0
darwin0.01.00.0
charles3.03.00.0
\n", "
" ], "text/plain": [ " oct nov dec\n", "bob 0.0 NaN 2.0\n", "colin NaN 1.0 0.0\n", "darwin 0.0 1.0 0.0\n", "charles 3.0 3.0 0.0" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bonus_array = np.array([[0,np.nan,2],[np.nan,1,0],[0, 1, 0], [3, 3, 0]])\n", "bonus_points = pd.DataFrame(bonus_array, columns=[\"oct\", \"nov\", \"dec\"], index=[\"bob\",\"colin\", \"darwin\", \"charles\"])\n", "bonus_points" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
decnovoctsep
aliceNaNNaNNaNNaN
bobNaNNaN9.0NaN
charlesNaN5.011.0NaN
colinNaNNaNNaNNaN
darwinNaN11.010.0NaN
\n", "
" ], "text/plain": [ " dec nov oct sep\n", "alice NaN NaN NaN NaN\n", "bob NaN NaN 9.0 NaN\n", "charles NaN 5.0 11.0 NaN\n", "colin NaN NaN NaN NaN\n", "darwin NaN 11.0 10.0 NaN" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades + bonus_points" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Có vẻ như phần bổ sung đã hoạt động trong một số trường hợp nhưng có quá nhiều phần tử hiện đang trống. Đó là bởi vì khi căn chỉnh `DataFrame`, một số cột và hàng chỉ xuất hiện ở một bên và do đó chúng được xem là bị thiếu ở phía bên kia (`NaN`). Sau đó, phép cộng với `NaN` cho kết quả `NaN`, dẫn đến kết quả như trên.\n", "\n", "## Xử lý dữ liệu bị thiếu\n", "Xử lý dữ liệu bị thiếu là một nhiệm vụ thường xuyên khi làm việc với dữ liệu thực tế. Pandas cung cấp một số công cụ để xử lý dữ liệu bị thiếu.\n", "\n", "Hãy thử khắc phục sự cố trên. Ví dụ: chúng ta có thể quyết định rằng dữ liệu bị thiếu sẽ dẫn đến kết quả là 0, thay vì `NaN`. Chúng ta có thể thay thế tất cả các giá trị `NaN` bằng một giá trị bất kỳ bằng cách sử dụng phương thức `fillna()`:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
decnovoctsep
alice0.00.00.00.0
bob0.00.09.00.0
charles0.05.011.00.0
colin0.00.00.00.0
darwin0.011.010.00.0
\n", "
" ], "text/plain": [ " dec nov oct sep\n", "alice 0.0 0.0 0.0 0.0\n", "bob 0.0 0.0 9.0 0.0\n", "charles 0.0 5.0 11.0 0.0\n", "colin 0.0 0.0 0.0 0.0\n", "darwin 0.0 11.0 10.0 0.0" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(grades + bonus_points).fillna(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tuy nhiên, có một chút không công bằng khi chúng ta đặt điểm bằng 0 vào tháng 9. Có lẽ chúng ta nên quyết định rằng điểm thiếu là điểm thiếu, nhưng điểm thưởng bị thiếu nên được thay thế bằng số không:" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
decnovoctsep
aliceNaN9.08.08.0
bobNaN9.09.010.0
charlesNaN5.011.04.0
colinNaNNaNNaNNaN
darwinNaN11.010.09.0
\n", "
" ], "text/plain": [ " dec nov oct sep\n", "alice NaN 9.0 8.0 8.0\n", "bob NaN 9.0 9.0 10.0\n", "charles NaN 5.0 11.0 4.0\n", "colin NaN NaN NaN NaN\n", "darwin NaN 11.0 10.0 9.0" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fixed_bonus_points = bonus_points.fillna(0)\n", "fixed_bonus_points.insert(0, \"sep\", 0)\n", "fixed_bonus_points.loc[\"alice\"] = 0\n", "grades + fixed_bonus_points" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Trông đã tốt hơn nhiều: mặc dù chúng ta đã tự tạo một số dữ liệu, nhưng chúng không quá bất công.\n", "\n", "Một cách khác để xử lý dữ liệu bị thiếu là nội suy. Hãy xem lại `bonus_points` `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
octnovdec
bob0.0NaN2.0
colinNaN1.00.0
darwin0.01.00.0
charles3.03.00.0
\n", "
" ], "text/plain": [ " oct nov dec\n", "bob 0.0 NaN 2.0\n", "colin NaN 1.0 0.0\n", "darwin 0.0 1.0 0.0\n", "charles 3.0 3.0 0.0" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bonus_points" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ, hãy gọi phương thức `nội suy`. Theo mặc định, nó nội suy theo chiều dọc (`trục=0`), vì vậy hãy bảo nó nội suy theo chiều ngang (`trục=1`)." ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
octnovdec
bob0.01.02.0
colinNaN1.00.0
darwin0.01.00.0
charles3.03.00.0
\n", "
" ], "text/plain": [ " oct nov dec\n", "bob 0.0 1.0 2.0\n", "colin NaN 1.0 0.0\n", "darwin 0.0 1.0 0.0\n", "charles 3.0 3.0 0.0" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bonus_points.interpolate(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bob có 0 điểm thưởng vào tháng 10 và 2 vào tháng 12. Khi chúng ta nội suy cho tháng 11, ta nhận được giá trị trung bình: 1 điểm thưởng. Colin có 1 điểm thưởng trong tháng 11, nhưng chúng ta không biết anh ấy có bao nhiêu điểm thưởng trong tháng 9, vì vậy ta không thể nội suy, đây là lý do tại sao vẫn còn thiếu một giá trị trong tháng 10 sau khi nội suy. Để khắc phục, chúng ta có thể set điểm thưởng tháng 9 bằng 0 trước khi nội suy." ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnovdec
bob0.00.01.02.0
colin0.00.51.00.0
darwin0.00.01.00.0
charles0.03.03.00.0
alice0.00.00.00.0
\n", "
" ], "text/plain": [ " sep oct nov dec\n", "bob 0.0 0.0 1.0 2.0\n", "colin 0.0 0.5 1.0 0.0\n", "darwin 0.0 0.0 1.0 0.0\n", "charles 0.0 3.0 3.0 0.0\n", "alice 0.0 0.0 0.0 0.0" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "better_bonus_points = bonus_points.copy()\n", "better_bonus_points.insert(0, \"sep\", 0)\n", "better_bonus_points.loc[\"alice\"] = 0\n", "better_bonus_points = better_bonus_points.interpolate(axis=1)\n", "better_bonus_points" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tuyệt vời, bây giờ chúng ta đã có điểm thưởng hợp lý ở khắp mọi nơi. Hãy cùng tìm hiểu các lớp cuối cùng:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
decnovoctsep
aliceNaN9.08.08.0
bobNaN10.09.010.0
charlesNaN5.011.04.0
colinNaNNaNNaNNaN
darwinNaN11.010.09.0
\n", "
" ], "text/plain": [ " dec nov oct sep\n", "alice NaN 9.0 8.0 8.0\n", "bob NaN 10.0 9.0 10.0\n", "charles NaN 5.0 11.0 4.0\n", "colin NaN NaN NaN NaN\n", "darwin NaN 11.0 10.0 9.0" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades + better_bonus_points" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hơi khó chịu khi cột tháng 9 kết thúc ở bên phải. Điều này là do `DataFrame` mà chúng ta đang thêm không có các cột giống hệt nhau (`DataFrame` `grades` thiếu cột `\"dec\"`), vì vậy, để làm cho mọi thứ có thể dự đoán được, pandas sắp xếp các cột cuối cùng theo thứ tự abc. Để khắc phục điều này, chúng ta chỉ cần thêm cột bị thiếu trước khi thêm:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnovdec
alice8.08.09.0NaN
bob10.09.010.0NaN
charles4.011.05.0NaN
colinNaNNaNNaNNaN
darwin9.010.011.0NaN
\n", "
" ], "text/plain": [ " sep oct nov dec\n", "alice 8.0 8.0 9.0 NaN\n", "bob 10.0 9.0 10.0 NaN\n", "charles 4.0 11.0 5.0 NaN\n", "colin NaN NaN NaN NaN\n", "darwin 9.0 10.0 11.0 NaN" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grades[\"dec\"] = np.nan\n", "final_grades = grades + better_bonus_points\n", "final_grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Không có nhiều thứ chúng ta có thể làm về tháng 12 và Colin: thật tệ khi chúng ta tự tạo điểm thưởng, nhưng chúng ta không thể tự tạo điểm một cách hợp lý được (tôi đoán một số giáo viên có thể làm được). Vì vậy, hãy gọi phương thức `dropna()` để loại bỏ các hàng chứa đầy `NaN`:" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnovdec
alice8.08.09.0NaN
bob10.09.010.0NaN
charles4.011.05.0NaN
darwin9.010.011.0NaN
\n", "
" ], "text/plain": [ " sep oct nov dec\n", "alice 8.0 8.0 9.0 NaN\n", "bob 10.0 9.0 10.0 NaN\n", "charles 4.0 11.0 5.0 NaN\n", "darwin 9.0 10.0 11.0 NaN" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_grades_clean = final_grades.dropna(how=\"all\")\n", "final_grades_clean" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ, hãy xóa các cột chứa đầy `NaN` bằng cách đặt đối số `axis` thành `1`:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnov
alice8.08.09.0
bob10.09.010.0
charles4.011.05.0
darwin9.010.011.0
\n", "
" ], "text/plain": [ " sep oct nov\n", "alice 8.0 8.0 9.0\n", "bob 10.0 9.0 10.0\n", "charles 4.0 11.0 5.0\n", "darwin 9.0 10.0 11.0" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_grades_clean = final_grades_clean.dropna(axis=1, how=\"all\")\n", "final_grades_clean" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tổng hợp với `groupby`\n", "Tương tự như ngôn ngữ SQL, pandas cho phép nhóm dữ liệu của bạn thành từng nhóm để chạy tính toán trên từng nhóm.\n", "\n", "Trước tiên, hãy thêm một số dữ liệu bổ sung về từng người để chúng ta có thể nhóm họ và hãy quay lại `DataFrame` `final_grades` để xem cách các giá trị `NaN` được xử lý:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnovdechobby
alice8.08.09.0NaNBiking
bob10.09.010.0NaNDancing
charles4.011.05.0NaNNaN
colinNaNNaNNaNNaNDancing
darwin9.010.011.0NaNBiking
\n", "
" ], "text/plain": [ " sep oct nov dec hobby\n", "alice 8.0 8.0 9.0 NaN Biking\n", "bob 10.0 9.0 10.0 NaN Dancing\n", "charles 4.0 11.0 5.0 NaN NaN\n", "colin NaN NaN NaN NaN Dancing\n", "darwin 9.0 10.0 11.0 NaN Biking" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_grades[\"hobby\"] = [\"Biking\", \"Dancing\", np.nan, \"Dancing\", \"Biking\"]\n", "final_grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ hãy nhóm dữ liệu trong `DataFrame` này theo sở thích:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grouped_grades = final_grades.groupby(\"hobby\")\n", "grouped_grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chúng ta đã sẵn sàng để tính điểm trung bình cho mỗi sở thích:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepoctnovdec
hobby
Biking8.59.010.0NaN
Dancing10.09.010.0NaN
\n", "
" ], "text/plain": [ " sep oct nov dec\n", "hobby \n", "Biking 8.5 9.0 10.0 NaN\n", "Dancing 10.0 9.0 10.0 NaN" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grouped_grades.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Điều đó thật dễ dàng! Lưu ý rằng các giá trị `NaN` đã bị bỏ qua khi tính rung bình." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bảng tổng hợp\n", "Pandas hỗ trợ [bảng tổng hợp](https://en.wikipedia.org/wiki/Pivot_table) dạng bảng tính cho phép tóm tắt dữ liệu nhanh chóng. Để minh họa điều này, hãy tạo một `DataFrame` đơn giản:" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
octnovdec
bob0.0NaN2.0
colinNaN1.00.0
darwin0.01.00.0
charles3.03.00.0
\n", "
" ], "text/plain": [ " oct nov dec\n", "bob 0.0 NaN 2.0\n", "colin NaN 1.0 0.0\n", "darwin 0.0 1.0 0.0\n", "charles 3.0 3.0 0.0" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bonus_points" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namemonthgradebonus
0alicesep8.0NaN
1aliceoct8.0NaN
2alicenov9.0NaN
3bobsep10.00.0
4boboct9.0NaN
5bobnov10.02.0
6charlessep4.03.0
7charlesoct11.03.0
8charlesnov5.00.0
9darwinsep9.00.0
10darwinoct10.01.0
11darwinnov11.00.0
\n", "
" ], "text/plain": [ " name month grade bonus\n", "0 alice sep 8.0 NaN\n", "1 alice oct 8.0 NaN\n", "2 alice nov 9.0 NaN\n", "3 bob sep 10.0 0.0\n", "4 bob oct 9.0 NaN\n", "5 bob nov 10.0 2.0\n", "6 charles sep 4.0 3.0\n", "7 charles oct 11.0 3.0\n", "8 charles nov 5.0 0.0\n", "9 darwin sep 9.0 0.0\n", "10 darwin oct 10.0 1.0\n", "11 darwin nov 11.0 0.0" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "more_grades = final_grades_clean.stack().reset_index()\n", "more_grades.columns = [\"name\", \"month\", \"grade\"]\n", "more_grades[\"bonus\"] = [np.nan, np.nan, np.nan, 0, np.nan, 2, 3, 3, 0, 0, 1, 0]\n", "more_grades" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ chúng ta có thể gọi hàm `pd.pivot_table()` cho `DataFrame` này, yêu cầu nhóm theo cột `name`. Theo mặc định, `pivot_table()` tính giá trị trung bình của từng cột số:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bonusgrade
name
aliceNaN8.333333
bob1.0000009.666667
charles2.0000006.666667
darwin0.33333310.000000
\n", "
" ], "text/plain": [ " bonus grade\n", "name \n", "alice NaN 8.333333\n", "bob 1.000000 9.666667\n", "charles 2.000000 6.666667\n", "darwin 0.333333 10.000000" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(more_grades, index=\"name\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chúng ta có thể thay đổi hàm tổng hợp bằng cách đặt đối số `aggfunc` và chúng ta cũng có thể chỉ định danh sách các cột có giá trị sẽ được tổng hợp:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bonusgrade
name
aliceNaN9.0
bob2.010.0
charles3.011.0
darwin1.011.0
\n", "
" ], "text/plain": [ " bonus grade\n", "name \n", "alice NaN 9.0\n", "bob 2.0 10.0\n", "charles 3.0 11.0\n", "darwin 1.0 11.0" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(more_grades, index=\"name\", values=[\"grade\",\"bonus\"], aggfunc=np.max)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chúng ta cũng có thể chỉ định `cột` để tổng hợp theo chiều ngang và yêu cầu tổng cộng cho mỗi hàng và cột bằng cách đặt `margins=True`:" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
monthnovoctsepAll
name
alice9.008.08.008.333333
bob10.009.010.009.666667
charles5.0011.04.006.666667
darwin11.0010.09.0010.000000
All8.759.57.758.666667
\n", "
" ], "text/plain": [ "month nov oct sep All\n", "name \n", "alice 9.00 8.0 8.00 8.333333\n", "bob 10.00 9.0 10.00 9.666667\n", "charles 5.00 11.0 4.00 6.666667\n", "darwin 11.00 10.0 9.00 10.000000\n", "All 8.75 9.5 7.75 8.666667" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(more_grades, index=\"name\", values=\"grade\", columns=\"month\", margins=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cuối cùng, chúng ta có thể chỉ định nhiều tên chỉ mục hoặc cột và pandas sẽ tạo các chỉ mục đa cấp:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
bonusgrade
namemonth
alicenovNaN9.00
octNaN8.00
sepNaN8.00
bobnov2.00010.00
octNaN9.00
sep0.00010.00
charlesnov0.0005.00
oct3.00011.00
sep3.0004.00
darwinnov0.00011.00
oct1.00010.00
sep0.0009.00
All1.1258.75
\n", "
" ], "text/plain": [ " bonus grade\n", "name month \n", "alice nov NaN 9.00\n", " oct NaN 8.00\n", " sep NaN 8.00\n", "bob nov 2.000 10.00\n", " oct NaN 9.00\n", " sep 0.000 10.00\n", "charles nov 0.000 5.00\n", " oct 3.000 11.00\n", " sep 3.000 4.00\n", "darwin nov 0.000 11.00\n", " oct 1.000 10.00\n", " sep 0.000 9.00\n", "All 1.125 8.75" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(more_grades, index=(\"name\", \"month\"), margins=True)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Chức năng tổng quan\n", "Khi xử lý `DataFrames` lớn, sẽ rất hữu ích nếu bạn có cái nhìn tổng quan nhanh về nội dung của nó. Pandas cung cấp một số chức năng cho việc này. Trước tiên, hãy tạo một `DataFrame` lớn với sự kết hợp của các giá trị số, giá trị bị thiếu và giá trị văn bản. Lưu ý cách Jupyter chỉ hiển thị các góc của `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCsome_textDEFGHI...QRSTUVWXYZ
0NaN11.044.0Blabla99.0NaN88.022.0165.0143.0...11.0NaN11.044.099.0NaN88.022.0165.0143.0
111.022.055.0Blabla110.0NaN99.033.0NaN154.0...22.011.022.055.0110.0NaN99.033.0NaN154.0
222.033.066.0Blabla121.011.0110.044.0NaN165.0...33.022.033.066.0121.011.0110.044.0NaN165.0
333.044.077.0Blabla132.022.0121.055.011.0NaN...44.033.044.077.0132.022.0121.055.011.0NaN
444.055.088.0Blabla143.033.0132.066.022.0NaN...55.044.055.088.0143.033.0132.066.022.0NaN
555.066.099.0Blabla154.044.0143.077.033.011.0...66.055.066.099.0154.044.0143.077.033.011.0
666.077.0110.0Blabla165.055.0154.088.044.022.0...77.066.077.0110.0165.055.0154.088.044.022.0
777.088.0121.0BlablaNaN66.0165.099.055.033.0...88.077.088.0121.0NaN66.0165.099.055.033.0
888.099.0132.0BlablaNaN77.0NaN110.066.044.0...99.088.099.0132.0NaN77.0NaN110.066.044.0
999.0110.0143.0Blabla11.088.0NaN121.077.055.0...110.099.0110.0143.011.088.0NaN121.077.055.0
10110.0121.0154.0Blabla22.099.011.0132.088.066.0...121.0110.0121.0154.022.099.011.0132.088.066.0
11121.0132.0165.0Blabla33.0110.022.0143.099.077.0...132.0121.0132.0165.033.0110.022.0143.099.077.0
12132.0143.0NaNBlabla44.0121.033.0154.0110.088.0...143.0132.0143.0NaN44.0121.033.0154.0110.088.0
13143.0154.0NaNBlabla55.0132.044.0165.0121.099.0...154.0143.0154.0NaN55.0132.044.0165.0121.099.0
14154.0165.011.0Blabla66.0143.055.0NaN132.0110.0...165.0154.0165.011.066.0143.055.0NaN132.0110.0
15165.0NaN22.0Blabla77.0154.066.0NaN143.0121.0...NaN165.0NaN22.077.0154.066.0NaN143.0121.0
16NaNNaN33.0Blabla88.0165.077.011.0154.0132.0...NaNNaNNaN33.088.0165.077.011.0154.0132.0
17NaN11.044.0Blabla99.0NaN88.022.0165.0143.0...11.0NaN11.044.099.0NaN88.022.0165.0143.0
1811.022.055.0Blabla110.0NaN99.033.0NaN154.0...22.011.022.055.0110.0NaN99.033.0NaN154.0
1922.033.066.0Blabla121.011.0110.044.0NaN165.0...33.022.033.066.0121.011.0110.044.0NaN165.0
2033.044.077.0Blabla132.022.0121.055.011.0NaN...44.033.044.077.0132.022.0121.055.011.0NaN
2144.055.088.0Blabla143.033.0132.066.022.0NaN...55.044.055.088.0143.033.0132.066.022.0NaN
2255.066.099.0Blabla154.044.0143.077.033.011.0...66.055.066.099.0154.044.0143.077.033.011.0
2366.077.0110.0Blabla165.055.0154.088.044.022.0...77.066.077.0110.0165.055.0154.088.044.022.0
2477.088.0121.0BlablaNaN66.0165.099.055.033.0...88.077.088.0121.0NaN66.0165.099.055.033.0
2588.099.0132.0BlablaNaN77.0NaN110.066.044.0...99.088.099.0132.0NaN77.0NaN110.066.044.0
2699.0110.0143.0Blabla11.088.0NaN121.077.055.0...110.099.0110.0143.011.088.0NaN121.077.055.0
27110.0121.0154.0Blabla22.099.011.0132.088.066.0...121.0110.0121.0154.022.099.011.0132.088.066.0
28121.0132.0165.0Blabla33.0110.022.0143.099.077.0...132.0121.0132.0165.033.0110.022.0143.099.077.0
29132.0143.0NaNBlabla44.0121.033.0154.0110.088.0...143.0132.0143.0NaN44.0121.033.0154.0110.088.0
..................................................................
997088.099.0132.0BlablaNaN77.0NaN110.066.044.0...99.088.099.0132.0NaN77.0NaN110.066.044.0
997199.0110.0143.0Blabla11.088.0NaN121.077.055.0...110.099.0110.0143.011.088.0NaN121.077.055.0
9972110.0121.0154.0Blabla22.099.011.0132.088.066.0...121.0110.0121.0154.022.099.011.0132.088.066.0
9973121.0132.0165.0Blabla33.0110.022.0143.099.077.0...132.0121.0132.0165.033.0110.022.0143.099.077.0
9974132.0143.0NaNBlabla44.0121.033.0154.0110.088.0...143.0132.0143.0NaN44.0121.033.0154.0110.088.0
9975143.0154.0NaNBlabla55.0132.044.0165.0121.099.0...154.0143.0154.0NaN55.0132.044.0165.0121.099.0
9976154.0165.011.0Blabla66.0143.055.0NaN132.0110.0...165.0154.0165.011.066.0143.055.0NaN132.0110.0
9977165.0NaN22.0Blabla77.0154.066.0NaN143.0121.0...NaN165.0NaN22.077.0154.066.0NaN143.0121.0
9978NaNNaN33.0Blabla88.0165.077.011.0154.0132.0...NaNNaNNaN33.088.0165.077.011.0154.0132.0
9979NaN11.044.0Blabla99.0NaN88.022.0165.0143.0...11.0NaN11.044.099.0NaN88.022.0165.0143.0
998011.022.055.0Blabla110.0NaN99.033.0NaN154.0...22.011.022.055.0110.0NaN99.033.0NaN154.0
998122.033.066.0Blabla121.011.0110.044.0NaN165.0...33.022.033.066.0121.011.0110.044.0NaN165.0
998233.044.077.0Blabla132.022.0121.055.011.0NaN...44.033.044.077.0132.022.0121.055.011.0NaN
998344.055.088.0Blabla143.033.0132.066.022.0NaN...55.044.055.088.0143.033.0132.066.022.0NaN
998455.066.099.0Blabla154.044.0143.077.033.011.0...66.055.066.099.0154.044.0143.077.033.011.0
998566.077.0110.0Blabla165.055.0154.088.044.022.0...77.066.077.0110.0165.055.0154.088.044.022.0
998677.088.0121.0BlablaNaN66.0165.099.055.033.0...88.077.088.0121.0NaN66.0165.099.055.033.0
998788.099.0132.0BlablaNaN77.0NaN110.066.044.0...99.088.099.0132.0NaN77.0NaN110.066.044.0
998899.0110.0143.0Blabla11.088.0NaN121.077.055.0...110.099.0110.0143.011.088.0NaN121.077.055.0
9989110.0121.0154.0Blabla22.099.011.0132.088.066.0...121.0110.0121.0154.022.099.011.0132.088.066.0
9990121.0132.0165.0Blabla33.0110.022.0143.099.077.0...132.0121.0132.0165.033.0110.022.0143.099.077.0
9991132.0143.0NaNBlabla44.0121.033.0154.0110.088.0...143.0132.0143.0NaN44.0121.033.0154.0110.088.0
9992143.0154.0NaNBlabla55.0132.044.0165.0121.099.0...154.0143.0154.0NaN55.0132.044.0165.0121.099.0
9993154.0165.011.0Blabla66.0143.055.0NaN132.0110.0...165.0154.0165.011.066.0143.055.0NaN132.0110.0
9994165.0NaN22.0Blabla77.0154.066.0NaN143.0121.0...NaN165.0NaN22.077.0154.066.0NaN143.0121.0
9995NaNNaN33.0Blabla88.0165.077.011.0154.0132.0...NaNNaNNaN33.088.0165.077.011.0154.0132.0
9996NaN11.044.0Blabla99.0NaN88.022.0165.0143.0...11.0NaN11.044.099.0NaN88.022.0165.0143.0
999711.022.055.0Blabla110.0NaN99.033.0NaN154.0...22.011.022.055.0110.0NaN99.033.0NaN154.0
999822.033.066.0Blabla121.011.0110.044.0NaN165.0...33.022.033.066.0121.011.0110.044.0NaN165.0
999933.044.077.0Blabla132.022.0121.055.011.0NaN...44.033.044.077.0132.022.0121.055.011.0NaN
\n", "

10000 rows × 27 columns

\n", "
" ], "text/plain": [ " A B C some_text D E F G H I \\\n", "0 NaN 11.0 44.0 Blabla 99.0 NaN 88.0 22.0 165.0 143.0 \n", "1 11.0 22.0 55.0 Blabla 110.0 NaN 99.0 33.0 NaN 154.0 \n", "2 22.0 33.0 66.0 Blabla 121.0 11.0 110.0 44.0 NaN 165.0 \n", "3 33.0 44.0 77.0 Blabla 132.0 22.0 121.0 55.0 11.0 NaN \n", "4 44.0 55.0 88.0 Blabla 143.0 33.0 132.0 66.0 22.0 NaN \n", "5 55.0 66.0 99.0 Blabla 154.0 44.0 143.0 77.0 33.0 11.0 \n", "6 66.0 77.0 110.0 Blabla 165.0 55.0 154.0 88.0 44.0 22.0 \n", "7 77.0 88.0 121.0 Blabla NaN 66.0 165.0 99.0 55.0 33.0 \n", "8 88.0 99.0 132.0 Blabla NaN 77.0 NaN 110.0 66.0 44.0 \n", "9 99.0 110.0 143.0 Blabla 11.0 88.0 NaN 121.0 77.0 55.0 \n", "10 110.0 121.0 154.0 Blabla 22.0 99.0 11.0 132.0 88.0 66.0 \n", "11 121.0 132.0 165.0 Blabla 33.0 110.0 22.0 143.0 99.0 77.0 \n", "12 132.0 143.0 NaN Blabla 44.0 121.0 33.0 154.0 110.0 88.0 \n", "13 143.0 154.0 NaN Blabla 55.0 132.0 44.0 165.0 121.0 99.0 \n", "14 154.0 165.0 11.0 Blabla 66.0 143.0 55.0 NaN 132.0 110.0 \n", "15 165.0 NaN 22.0 Blabla 77.0 154.0 66.0 NaN 143.0 121.0 \n", "16 NaN NaN 33.0 Blabla 88.0 165.0 77.0 11.0 154.0 132.0 \n", "17 NaN 11.0 44.0 Blabla 99.0 NaN 88.0 22.0 165.0 143.0 \n", "18 11.0 22.0 55.0 Blabla 110.0 NaN 99.0 33.0 NaN 154.0 \n", "19 22.0 33.0 66.0 Blabla 121.0 11.0 110.0 44.0 NaN 165.0 \n", "20 33.0 44.0 77.0 Blabla 132.0 22.0 121.0 55.0 11.0 NaN \n", "21 44.0 55.0 88.0 Blabla 143.0 33.0 132.0 66.0 22.0 NaN \n", "22 55.0 66.0 99.0 Blabla 154.0 44.0 143.0 77.0 33.0 11.0 \n", "23 66.0 77.0 110.0 Blabla 165.0 55.0 154.0 88.0 44.0 22.0 \n", "24 77.0 88.0 121.0 Blabla NaN 66.0 165.0 99.0 55.0 33.0 \n", "25 88.0 99.0 132.0 Blabla NaN 77.0 NaN 110.0 66.0 44.0 \n", "26 99.0 110.0 143.0 Blabla 11.0 88.0 NaN 121.0 77.0 55.0 \n", "27 110.0 121.0 154.0 Blabla 22.0 99.0 11.0 132.0 88.0 66.0 \n", "28 121.0 132.0 165.0 Blabla 33.0 110.0 22.0 143.0 99.0 77.0 \n", "29 132.0 143.0 NaN Blabla 44.0 121.0 33.0 154.0 110.0 88.0 \n", "... ... ... ... ... ... ... ... ... ... ... \n", "9970 88.0 99.0 132.0 Blabla NaN 77.0 NaN 110.0 66.0 44.0 \n", "9971 99.0 110.0 143.0 Blabla 11.0 88.0 NaN 121.0 77.0 55.0 \n", "9972 110.0 121.0 154.0 Blabla 22.0 99.0 11.0 132.0 88.0 66.0 \n", "9973 121.0 132.0 165.0 Blabla 33.0 110.0 22.0 143.0 99.0 77.0 \n", "9974 132.0 143.0 NaN Blabla 44.0 121.0 33.0 154.0 110.0 88.0 \n", "9975 143.0 154.0 NaN Blabla 55.0 132.0 44.0 165.0 121.0 99.0 \n", "9976 154.0 165.0 11.0 Blabla 66.0 143.0 55.0 NaN 132.0 110.0 \n", "9977 165.0 NaN 22.0 Blabla 77.0 154.0 66.0 NaN 143.0 121.0 \n", "9978 NaN NaN 33.0 Blabla 88.0 165.0 77.0 11.0 154.0 132.0 \n", "9979 NaN 11.0 44.0 Blabla 99.0 NaN 88.0 22.0 165.0 143.0 \n", "9980 11.0 22.0 55.0 Blabla 110.0 NaN 99.0 33.0 NaN 154.0 \n", "9981 22.0 33.0 66.0 Blabla 121.0 11.0 110.0 44.0 NaN 165.0 \n", "9982 33.0 44.0 77.0 Blabla 132.0 22.0 121.0 55.0 11.0 NaN \n", "9983 44.0 55.0 88.0 Blabla 143.0 33.0 132.0 66.0 22.0 NaN \n", "9984 55.0 66.0 99.0 Blabla 154.0 44.0 143.0 77.0 33.0 11.0 \n", "9985 66.0 77.0 110.0 Blabla 165.0 55.0 154.0 88.0 44.0 22.0 \n", "9986 77.0 88.0 121.0 Blabla NaN 66.0 165.0 99.0 55.0 33.0 \n", "9987 88.0 99.0 132.0 Blabla NaN 77.0 NaN 110.0 66.0 44.0 \n", "9988 99.0 110.0 143.0 Blabla 11.0 88.0 NaN 121.0 77.0 55.0 \n", "9989 110.0 121.0 154.0 Blabla 22.0 99.0 11.0 132.0 88.0 66.0 \n", "9990 121.0 132.0 165.0 Blabla 33.0 110.0 22.0 143.0 99.0 77.0 \n", "9991 132.0 143.0 NaN Blabla 44.0 121.0 33.0 154.0 110.0 88.0 \n", "9992 143.0 154.0 NaN Blabla 55.0 132.0 44.0 165.0 121.0 99.0 \n", "9993 154.0 165.0 11.0 Blabla 66.0 143.0 55.0 NaN 132.0 110.0 \n", "9994 165.0 NaN 22.0 Blabla 77.0 154.0 66.0 NaN 143.0 121.0 \n", "9995 NaN NaN 33.0 Blabla 88.0 165.0 77.0 11.0 154.0 132.0 \n", "9996 NaN 11.0 44.0 Blabla 99.0 NaN 88.0 22.0 165.0 143.0 \n", "9997 11.0 22.0 55.0 Blabla 110.0 NaN 99.0 33.0 NaN 154.0 \n", "9998 22.0 33.0 66.0 Blabla 121.0 11.0 110.0 44.0 NaN 165.0 \n", "9999 33.0 44.0 77.0 Blabla 132.0 22.0 121.0 55.0 11.0 NaN \n", "\n", " ... Q R S T U V W X Y \\\n", "0 ... 11.0 NaN 11.0 44.0 99.0 NaN 88.0 22.0 165.0 \n", "1 ... 22.0 11.0 22.0 55.0 110.0 NaN 99.0 33.0 NaN \n", "2 ... 33.0 22.0 33.0 66.0 121.0 11.0 110.0 44.0 NaN \n", "3 ... 44.0 33.0 44.0 77.0 132.0 22.0 121.0 55.0 11.0 \n", "4 ... 55.0 44.0 55.0 88.0 143.0 33.0 132.0 66.0 22.0 \n", "5 ... 66.0 55.0 66.0 99.0 154.0 44.0 143.0 77.0 33.0 \n", "6 ... 77.0 66.0 77.0 110.0 165.0 55.0 154.0 88.0 44.0 \n", "7 ... 88.0 77.0 88.0 121.0 NaN 66.0 165.0 99.0 55.0 \n", "8 ... 99.0 88.0 99.0 132.0 NaN 77.0 NaN 110.0 66.0 \n", "9 ... 110.0 99.0 110.0 143.0 11.0 88.0 NaN 121.0 77.0 \n", "10 ... 121.0 110.0 121.0 154.0 22.0 99.0 11.0 132.0 88.0 \n", "11 ... 132.0 121.0 132.0 165.0 33.0 110.0 22.0 143.0 99.0 \n", "12 ... 143.0 132.0 143.0 NaN 44.0 121.0 33.0 154.0 110.0 \n", "13 ... 154.0 143.0 154.0 NaN 55.0 132.0 44.0 165.0 121.0 \n", "14 ... 165.0 154.0 165.0 11.0 66.0 143.0 55.0 NaN 132.0 \n", "15 ... NaN 165.0 NaN 22.0 77.0 154.0 66.0 NaN 143.0 \n", "16 ... NaN NaN NaN 33.0 88.0 165.0 77.0 11.0 154.0 \n", "17 ... 11.0 NaN 11.0 44.0 99.0 NaN 88.0 22.0 165.0 \n", "18 ... 22.0 11.0 22.0 55.0 110.0 NaN 99.0 33.0 NaN \n", "19 ... 33.0 22.0 33.0 66.0 121.0 11.0 110.0 44.0 NaN \n", "20 ... 44.0 33.0 44.0 77.0 132.0 22.0 121.0 55.0 11.0 \n", "21 ... 55.0 44.0 55.0 88.0 143.0 33.0 132.0 66.0 22.0 \n", "22 ... 66.0 55.0 66.0 99.0 154.0 44.0 143.0 77.0 33.0 \n", "23 ... 77.0 66.0 77.0 110.0 165.0 55.0 154.0 88.0 44.0 \n", "24 ... 88.0 77.0 88.0 121.0 NaN 66.0 165.0 99.0 55.0 \n", "25 ... 99.0 88.0 99.0 132.0 NaN 77.0 NaN 110.0 66.0 \n", "26 ... 110.0 99.0 110.0 143.0 11.0 88.0 NaN 121.0 77.0 \n", "27 ... 121.0 110.0 121.0 154.0 22.0 99.0 11.0 132.0 88.0 \n", "28 ... 132.0 121.0 132.0 165.0 33.0 110.0 22.0 143.0 99.0 \n", "29 ... 143.0 132.0 143.0 NaN 44.0 121.0 33.0 154.0 110.0 \n", "... ... ... ... ... ... ... ... ... ... ... \n", "9970 ... 99.0 88.0 99.0 132.0 NaN 77.0 NaN 110.0 66.0 \n", "9971 ... 110.0 99.0 110.0 143.0 11.0 88.0 NaN 121.0 77.0 \n", "9972 ... 121.0 110.0 121.0 154.0 22.0 99.0 11.0 132.0 88.0 \n", "9973 ... 132.0 121.0 132.0 165.0 33.0 110.0 22.0 143.0 99.0 \n", "9974 ... 143.0 132.0 143.0 NaN 44.0 121.0 33.0 154.0 110.0 \n", "9975 ... 154.0 143.0 154.0 NaN 55.0 132.0 44.0 165.0 121.0 \n", "9976 ... 165.0 154.0 165.0 11.0 66.0 143.0 55.0 NaN 132.0 \n", "9977 ... NaN 165.0 NaN 22.0 77.0 154.0 66.0 NaN 143.0 \n", "9978 ... NaN NaN NaN 33.0 88.0 165.0 77.0 11.0 154.0 \n", "9979 ... 11.0 NaN 11.0 44.0 99.0 NaN 88.0 22.0 165.0 \n", "9980 ... 22.0 11.0 22.0 55.0 110.0 NaN 99.0 33.0 NaN \n", "9981 ... 33.0 22.0 33.0 66.0 121.0 11.0 110.0 44.0 NaN \n", "9982 ... 44.0 33.0 44.0 77.0 132.0 22.0 121.0 55.0 11.0 \n", "9983 ... 55.0 44.0 55.0 88.0 143.0 33.0 132.0 66.0 22.0 \n", "9984 ... 66.0 55.0 66.0 99.0 154.0 44.0 143.0 77.0 33.0 \n", "9985 ... 77.0 66.0 77.0 110.0 165.0 55.0 154.0 88.0 44.0 \n", "9986 ... 88.0 77.0 88.0 121.0 NaN 66.0 165.0 99.0 55.0 \n", "9987 ... 99.0 88.0 99.0 132.0 NaN 77.0 NaN 110.0 66.0 \n", "9988 ... 110.0 99.0 110.0 143.0 11.0 88.0 NaN 121.0 77.0 \n", "9989 ... 121.0 110.0 121.0 154.0 22.0 99.0 11.0 132.0 88.0 \n", "9990 ... 132.0 121.0 132.0 165.0 33.0 110.0 22.0 143.0 99.0 \n", "9991 ... 143.0 132.0 143.0 NaN 44.0 121.0 33.0 154.0 110.0 \n", "9992 ... 154.0 143.0 154.0 NaN 55.0 132.0 44.0 165.0 121.0 \n", "9993 ... 165.0 154.0 165.0 11.0 66.0 143.0 55.0 NaN 132.0 \n", "9994 ... NaN 165.0 NaN 22.0 77.0 154.0 66.0 NaN 143.0 \n", "9995 ... NaN NaN NaN 33.0 88.0 165.0 77.0 11.0 154.0 \n", "9996 ... 11.0 NaN 11.0 44.0 99.0 NaN 88.0 22.0 165.0 \n", "9997 ... 22.0 11.0 22.0 55.0 110.0 NaN 99.0 33.0 NaN \n", "9998 ... 33.0 22.0 33.0 66.0 121.0 11.0 110.0 44.0 NaN \n", "9999 ... 44.0 33.0 44.0 77.0 132.0 22.0 121.0 55.0 11.0 \n", "\n", " Z \n", "0 143.0 \n", "1 154.0 \n", "2 165.0 \n", "3 NaN \n", "4 NaN \n", "5 11.0 \n", "6 22.0 \n", "7 33.0 \n", "8 44.0 \n", "9 55.0 \n", "10 66.0 \n", "11 77.0 \n", "12 88.0 \n", "13 99.0 \n", "14 110.0 \n", "15 121.0 \n", "16 132.0 \n", "17 143.0 \n", "18 154.0 \n", "19 165.0 \n", "20 NaN \n", "21 NaN \n", "22 11.0 \n", "23 22.0 \n", "24 33.0 \n", "25 44.0 \n", "26 55.0 \n", "27 66.0 \n", "28 77.0 \n", "29 88.0 \n", "... ... \n", "9970 44.0 \n", "9971 55.0 \n", "9972 66.0 \n", "9973 77.0 \n", "9974 88.0 \n", "9975 99.0 \n", "9976 110.0 \n", "9977 121.0 \n", "9978 132.0 \n", "9979 143.0 \n", "9980 154.0 \n", "9981 165.0 \n", "9982 NaN \n", "9983 NaN \n", "9984 11.0 \n", "9985 22.0 \n", "9986 33.0 \n", "9987 44.0 \n", "9988 55.0 \n", "9989 66.0 \n", "9990 77.0 \n", "9991 88.0 \n", "9992 99.0 \n", "9993 110.0 \n", "9994 121.0 \n", "9995 132.0 \n", "9996 143.0 \n", "9997 154.0 \n", "9998 165.0 \n", "9999 NaN \n", "\n", "[10000 rows x 27 columns]" ] }, "execution_count": 124, "metadata": {}, "output_type": "execute_result" } ], "source": [ "much_data = np.fromfunction(lambda x,y: (x+y*y)%17*11, (10000, 26))\n", "large_df = pd.DataFrame(much_data, columns=list(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"))\n", "large_df[large_df % 16 == 0] = np.nan\n", "large_df.insert(3,\"some_text\", \"Blabla\")\n", "large_df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Phương thức `head()` trả về 5 hàng trên cùng:" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCsome_textDEFGHI...QRSTUVWXYZ
0NaN11.044.0Blabla99.0NaN88.022.0165.0143.0...11.0NaN11.044.099.0NaN88.022.0165.0143.0
111.022.055.0Blabla110.0NaN99.033.0NaN154.0...22.011.022.055.0110.0NaN99.033.0NaN154.0
222.033.066.0Blabla121.011.0110.044.0NaN165.0...33.022.033.066.0121.011.0110.044.0NaN165.0
333.044.077.0Blabla132.022.0121.055.011.0NaN...44.033.044.077.0132.022.0121.055.011.0NaN
444.055.088.0Blabla143.033.0132.066.022.0NaN...55.044.055.088.0143.033.0132.066.022.0NaN
\n", "

5 rows × 27 columns

\n", "
" ], "text/plain": [ " A B C some_text D E F G H I ... \\\n", "0 NaN 11.0 44.0 Blabla 99.0 NaN 88.0 22.0 165.0 143.0 ... \n", "1 11.0 22.0 55.0 Blabla 110.0 NaN 99.0 33.0 NaN 154.0 ... \n", "2 22.0 33.0 66.0 Blabla 121.0 11.0 110.0 44.0 NaN 165.0 ... \n", "3 33.0 44.0 77.0 Blabla 132.0 22.0 121.0 55.0 11.0 NaN ... \n", "4 44.0 55.0 88.0 Blabla 143.0 33.0 132.0 66.0 22.0 NaN ... \n", "\n", " Q R S T U V W X Y Z \n", "0 11.0 NaN 11.0 44.0 99.0 NaN 88.0 22.0 165.0 143.0 \n", "1 22.0 11.0 22.0 55.0 110.0 NaN 99.0 33.0 NaN 154.0 \n", "2 33.0 22.0 33.0 66.0 121.0 11.0 110.0 44.0 NaN 165.0 \n", "3 44.0 33.0 44.0 77.0 132.0 22.0 121.0 55.0 11.0 NaN \n", "4 55.0 44.0 55.0 88.0 143.0 33.0 132.0 66.0 22.0 NaN \n", "\n", "[5 rows x 27 columns]" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "large_df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tất nhiên, cũng có chức năng `tail()` để xem 5 hàng dưới cùng. Bạn cũng có thể chỉ định số hàng bạn muốn:" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCsome_textDEFGHI...QRSTUVWXYZ
999822.033.066.0Blabla121.011.0110.044.0NaN165.0...33.022.033.066.0121.011.0110.044.0NaN165.0
999933.044.077.0Blabla132.022.0121.055.011.0NaN...44.033.044.077.0132.022.0121.055.011.0NaN
\n", "

2 rows × 27 columns

\n", "
" ], "text/plain": [ " A B C some_text D E F G H I \\\n", "9998 22.0 33.0 66.0 Blabla 121.0 11.0 110.0 44.0 NaN 165.0 \n", "9999 33.0 44.0 77.0 Blabla 132.0 22.0 121.0 55.0 11.0 NaN \n", "\n", " ... Q R S T U V W X Y Z \n", "9998 ... 33.0 22.0 33.0 66.0 121.0 11.0 110.0 44.0 NaN 165.0 \n", "9999 ... 44.0 33.0 44.0 77.0 132.0 22.0 121.0 55.0 11.0 NaN \n", "\n", "[2 rows x 27 columns]" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "large_df.tail(n=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Phương thức `info()` in ra bản tóm tắt nội dung của từng cột:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 10000 entries, 0 to 9999\n", "Data columns (total 27 columns):\n", "A 8823 non-null float64\n", "B 8824 non-null float64\n", "C 8824 non-null float64\n", "some_text 10000 non-null object\n", "D 8824 non-null float64\n", "E 8822 non-null float64\n", "F 8824 non-null float64\n", "G 8824 non-null float64\n", "H 8822 non-null float64\n", "I 8823 non-null float64\n", "J 8823 non-null float64\n", "K 8822 non-null float64\n", "L 8824 non-null float64\n", "M 8824 non-null float64\n", "N 8822 non-null float64\n", "O 8824 non-null float64\n", "P 8824 non-null float64\n", "Q 8824 non-null float64\n", "R 8823 non-null float64\n", "S 8824 non-null float64\n", "T 8824 non-null float64\n", "U 8824 non-null float64\n", "V 8822 non-null float64\n", "W 8824 non-null float64\n", "X 8824 non-null float64\n", "Y 8822 non-null float64\n", "Z 8823 non-null float64\n", "dtypes: float64(26), object(1)\n", "memory usage: 2.1+ MB\n" ] } ], "source": [ "large_df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cuối cùng, phương thức `describe()` cung cấp một cái nhìn tổng quan về các giá trị tổng hợp chính trên mỗi cột:\n", "* `count`: số giá trị khác null (không phải NaN)\n", "* `mean`: giá trị trung bình của các giá trị khác null\n", "* `std`: [độ lệch chuẩn](https://en.wikipedia.org/wiki/Standard_deviation) của các giá trị khác null\n", "* `min`: giá trị khác null tối thiểu\n", "* `25%`, `50%`, `75%`: [phần trăm thứ 25, 50 và 75](https://en.wikipedia.org/wiki/Percentile) của các giá trị khác null\n", "* `max`: giá trị lớn nhất khác null" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDEFGHIJ...QRSTUVWXYZ
count8823.0000008824.0000008824.0000008824.0000008822.0000008824.0000008824.0000008822.0000008823.0000008823.000000...8824.0000008823.0000008824.0000008824.0000008824.0000008822.0000008824.0000008824.0000008822.0000008823.000000
mean87.97755987.97257587.98753488.01246687.98379188.00748087.97756188.00000088.02244188.022441...87.97257587.97755987.97257587.98753488.01246687.98379188.00748087.97756188.00000088.022441
std47.53591147.53552347.52167947.52167947.53500147.51937147.52975547.53687947.53591147.535911...47.53552347.53591147.53552347.52167947.52167947.53500147.51937147.52975547.53687947.535911
min11.00000011.00000011.00000011.00000011.00000011.00000011.00000011.00000011.00000011.000000...11.00000011.00000011.00000011.00000011.00000011.00000011.00000011.00000011.00000011.000000
25%44.00000044.00000044.00000044.00000044.00000044.00000044.00000044.00000044.00000044.000000...44.00000044.00000044.00000044.00000044.00000044.00000044.00000044.00000044.00000044.000000
50%88.00000088.00000088.00000088.00000088.00000088.00000088.00000088.00000088.00000088.000000...88.00000088.00000088.00000088.00000088.00000088.00000088.00000088.00000088.00000088.000000
75%132.000000132.000000132.000000132.000000132.000000132.000000132.000000132.000000132.000000132.000000...132.000000132.000000132.000000132.000000132.000000132.000000132.000000132.000000132.000000132.000000
max165.000000165.000000165.000000165.000000165.000000165.000000165.000000165.000000165.000000165.000000...165.000000165.000000165.000000165.000000165.000000165.000000165.000000165.000000165.000000165.000000
\n", "

8 rows × 26 columns

\n", "
" ], "text/plain": [ " A B C D E \\\n", "count 8823.000000 8824.000000 8824.000000 8824.000000 8822.000000 \n", "mean 87.977559 87.972575 87.987534 88.012466 87.983791 \n", "std 47.535911 47.535523 47.521679 47.521679 47.535001 \n", "min 11.000000 11.000000 11.000000 11.000000 11.000000 \n", "25% 44.000000 44.000000 44.000000 44.000000 44.000000 \n", "50% 88.000000 88.000000 88.000000 88.000000 88.000000 \n", "75% 132.000000 132.000000 132.000000 132.000000 132.000000 \n", "max 165.000000 165.000000 165.000000 165.000000 165.000000 \n", "\n", " F G H I J \\\n", "count 8824.000000 8824.000000 8822.000000 8823.000000 8823.000000 \n", "mean 88.007480 87.977561 88.000000 88.022441 88.022441 \n", "std 47.519371 47.529755 47.536879 47.535911 47.535911 \n", "min 11.000000 11.000000 11.000000 11.000000 11.000000 \n", "25% 44.000000 44.000000 44.000000 44.000000 44.000000 \n", "50% 88.000000 88.000000 88.000000 88.000000 88.000000 \n", "75% 132.000000 132.000000 132.000000 132.000000 132.000000 \n", "max 165.000000 165.000000 165.000000 165.000000 165.000000 \n", "\n", " ... Q R S T \\\n", "count ... 8824.000000 8823.000000 8824.000000 8824.000000 \n", "mean ... 87.972575 87.977559 87.972575 87.987534 \n", "std ... 47.535523 47.535911 47.535523 47.521679 \n", "min ... 11.000000 11.000000 11.000000 11.000000 \n", "25% ... 44.000000 44.000000 44.000000 44.000000 \n", "50% ... 88.000000 88.000000 88.000000 88.000000 \n", "75% ... 132.000000 132.000000 132.000000 132.000000 \n", "max ... 165.000000 165.000000 165.000000 165.000000 \n", "\n", " U V W X Y \\\n", "count 8824.000000 8822.000000 8824.000000 8824.000000 8822.000000 \n", "mean 88.012466 87.983791 88.007480 87.977561 88.000000 \n", "std 47.521679 47.535001 47.519371 47.529755 47.536879 \n", "min 11.000000 11.000000 11.000000 11.000000 11.000000 \n", "25% 44.000000 44.000000 44.000000 44.000000 44.000000 \n", "50% 88.000000 88.000000 88.000000 88.000000 88.000000 \n", "75% 132.000000 132.000000 132.000000 132.000000 132.000000 \n", "max 165.000000 165.000000 165.000000 165.000000 165.000000 \n", "\n", " Z \n", "count 8823.000000 \n", "mean 88.022441 \n", "std 47.535911 \n", "min 11.000000 \n", "25% 44.000000 \n", "50% 88.000000 \n", "75% 132.000000 \n", "max 165.000000 \n", "\n", "[8 rows x 26 columns]" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "large_df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lưu & nạp\n", "Pandas có thể lưu `DataFrame` vào các chương trình phụ trợ khác nhau, bao gồm các định dạng tệp như CSV, Excel, JSON, HTML và HDF5 hoặc vào cơ sở dữ liệu SQL. Hãy tạo một `DataFrame` để chứng minh điều này:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyweightbirthyearchildren
aliceBiking68.51985NaN
bobDancing83.119843.0
\n", "
" ], "text/plain": [ " hobby weight birthyear children\n", "alice Biking 68.5 1985 NaN\n", "bob Dancing 83.1 1984 3.0" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_df = pd.DataFrame(\n", " [[\"Biking\", 68.5, 1985, np.nan], [\"Dancing\", 83.1, 1984, 3]], \n", " columns=[\"hobby\",\"weight\",\"birthyear\",\"children\"],\n", " index=[\"alice\", \"bob\"]\n", ")\n", "my_df" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Lưu\n", "Hãy lưu nó dưới dạng CSV, HTML và JSON:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [], "source": [ "my_df.to_csv(\"my_df.csv\")\n", "my_df.to_html(\"my_df.html\")\n", "my_df.to_json(\"my_df.json\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Xong! Hãy xem qua những gì đã được lưu:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# my_df.csv\n", ",hobby,weight,birthyear,children\n", "alice,Biking,68.5,1985,\n", "bob,Dancing,83.1,1984,3.0\n", "\n", "\n", "# my_df.html\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyweightbirthyearchildren
aliceBiking68.51985NaN
bobDancing83.119843.0
\n", "\n", "# my_df.json\n", "{\"hobby\":{\"alice\":\"Biking\",\"bob\":\"Dancing\"},\"weight\":{\"alice\":68.5,\"bob\":83.1},\"birthyear\":{\"alice\":1985,\"bob\":1984},\"children\":{\"alice\":null,\"bob\":3.0}}\n", "\n" ] } ], "source": [ "for filename in (\"my_df.csv\", \"my_df.html\", \"my_df.json\"):\n", " print(\"#\", filename)\n", " with open(filename, \"rt\") as f:\n", " print(f.read())\n", " print()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng chỉ mục được lưu dưới dạng cột đầu tiên (không có tên) trong tệp CSV, dưới dạng thẻ `` trong HTML và dưới dạng khóa trong JSON.\n", "\n", "Lưu vào các định dạng khác hoạt động rất giống nhau, nhưng một số định dạng yêu cầu cài đặt thêm thư viện. Ví dụ: lưu vào Excel yêu cầu thư viện openpyxl:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No module named 'openpyxl'\n" ] } ], "source": [ "try:\n", " my_df.to_excel(\"my_df.xlsx\", sheet_name='People')\n", "except ImportError as e:\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Nạp\n", "Bây giờ, hãy nạp lại tệp CSV của chúng ta vào `DataFrame`:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hobbyweightbirthyearchildren
aliceBiking68.51985NaN
bobDancing83.119843.0
\n", "
" ], "text/plain": [ " hobby weight birthyear children\n", "alice Biking 68.5 1985 NaN\n", "bob Dancing 83.1 1984 3.0" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_df_loaded = pd.read_csv(\"my_df.csv\", index_col=0)\n", "my_df_loaded" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Như bạn có thể đoán, cũng có các hàm `read_json`, `read_html`, `read_excel` tương tự. Chúng ta cũng có thể đọc dữ liệu trực tiếp từ Internet. Ví dụ: hãy tải 1.000 thành phố nằm đầu của Hoa Kỳ từ github:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
StatePopulationlatlon
City
MarysvilleWashington6326948.051764-122.177082
PerrisCalifornia7232633.782519-117.228648
ClevelandOhio39011341.499320-81.694361
WorcesterMassachusetts18254442.262593-71.802293
ColumbiaSouth Carolina13335834.000710-81.034814
\n", "
" ], "text/plain": [ " State Population lat lon\n", "City \n", "Marysville Washington 63269 48.051764 -122.177082\n", "Perris California 72326 33.782519 -117.228648\n", "Cleveland Ohio 390113 41.499320 -81.694361\n", "Worcester Massachusetts 182544 42.262593 -71.802293\n", "Columbia South Carolina 133358 34.000710 -81.034814" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "us_cities = None\n", "try:\n", " csv_url = \"https://raw.githubusercontent.com/plotly/datasets/master/us-cities-top-1k.csv\"\n", " us_cities = pd.read_csv(csv_url, index_col=0)\n", " us_cities = us_cities.head()\n", "except IOError as e:\n", " print(e)\n", "us_cities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Có nhiều tùy chọn hơn, đặc biệt là về định dạng ngày giờ. Hãy xem [tài liệu](http://pandas.pydata.org/pandas-docs/stable/io.html) để biết thêm chi tiết." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kết hợp `DataFrame`\n", "\n", "## Phép gộp giống như SQL\n", "Một tính năng mạnh mẽ của pandas là khả năng thực hiện các phép gộp giống SQL trên `DataFrame`. Các kiểu gộp khác nhau được hỗ trợ: gộp bên trong, gộp ngoài trái/phải và gộp đầy đủ. Để minh họa điều này, hãy bắt đầu bằng cách tạo một vài `DataFrame` đơn giản:" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statecitylatlng
0CASan Francisco37.781334-122.416728
1NYNew York40.705649-74.008344
2FLMiami25.791100-80.320733
3OHCleveland41.473508-81.739791
4UTSalt Lake City40.755851-111.896657
\n", "
" ], "text/plain": [ " state city lat lng\n", "0 CA San Francisco 37.781334 -122.416728\n", "1 NY New York 40.705649 -74.008344\n", "2 FL Miami 25.791100 -80.320733\n", "3 OH Cleveland 41.473508 -81.739791\n", "4 UT Salt Lake City 40.755851 -111.896657" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_loc = pd.DataFrame(\n", " [\n", " [\"CA\", \"San Francisco\", 37.781334, -122.416728],\n", " [\"NY\", \"New York\", 40.705649, -74.008344],\n", " [\"FL\", \"Miami\", 25.791100, -80.320733],\n", " [\"OH\", \"Cleveland\", 41.473508, -81.739791],\n", " [\"UT\", \"Salt Lake City\", 40.755851, -111.896657]\n", " ], columns=[\"state\", \"city\", \"lat\", \"lng\"])\n", "city_loc" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
populationcitystate
3808976San FranciscoCalifornia
48363710New YorkNew-York
5413201MiamiFlorida
62242193HoustonTexas
\n", "
" ], "text/plain": [ " population city state\n", "3 808976 San Francisco California\n", "4 8363710 New York New-York\n", "5 413201 Miami Florida\n", "6 2242193 Houston Texas" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_pop = pd.DataFrame(\n", " [\n", " [808976, \"San Francisco\", \"California\"],\n", " [8363710, \"New York\", \"New-York\"],\n", " [413201, \"Miami\", \"Florida\"],\n", " [2242193, \"Houston\", \"Texas\"]\n", " ], index=[3,4,5,6], columns=[\"population\", \"city\", \"state\"])\n", "city_pop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ, hãy gộp các `DataFrame` này bằng hàm `merge()`:" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
state_xcitylatlngpopulationstate_y
0CASan Francisco37.781334-122.416728808976California
1NYNew York40.705649-74.0083448363710New-York
2FLMiami25.791100-80.320733413201Florida
\n", "
" ], "text/plain": [ " state_x city lat lng population state_y\n", "0 CA San Francisco 37.781334 -122.416728 808976 California\n", "1 NY New York 40.705649 -74.008344 8363710 New-York\n", "2 FL Miami 25.791100 -80.320733 413201 Florida" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left=city_loc, right=city_pop, on=\"city\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng cả `DataFrame` đều có một cột có tên là `state`, do đó, kết quả là chúng được đổi tên thành `state_x` và `state_y`.\n", "\n", "Ngoài ra, hãy lưu ý rằng Cleveland, Thành phố Salt Lake và Houston đã bị loại bỏ vì chúng không tồn tại trong *cả hai* `DataFrame`. Điều này tương đương với SQL `INNER JOIN`. Nếu bạn muốn `FULL OUTER JOIN`, trong đó không có thành phố nào bị loại bỏ và các giá trị `NaN` được thêm vào, bạn phải chỉ định `how=\"outer\"`:" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
state_xcitylatlngpopulationstate_y
0CASan Francisco37.781334-122.416728808976.0California
1NYNew York40.705649-74.0083448363710.0New-York
2FLMiami25.791100-80.320733413201.0Florida
3OHCleveland41.473508-81.739791NaNNaN
4UTSalt Lake City40.755851-111.896657NaNNaN
5NaNHoustonNaNNaN2242193.0Texas
\n", "
" ], "text/plain": [ " state_x city lat lng population state_y\n", "0 CA San Francisco 37.781334 -122.416728 808976.0 California\n", "1 NY New York 40.705649 -74.008344 8363710.0 New-York\n", "2 FL Miami 25.791100 -80.320733 413201.0 Florida\n", "3 OH Cleveland 41.473508 -81.739791 NaN NaN\n", "4 UT Salt Lake City 40.755851 -111.896657 NaN NaN\n", "5 NaN Houston NaN NaN 2242193.0 Texas" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_cities = pd.merge(left=city_loc, right=city_pop, on=\"city\", how=\"outer\")\n", "all_cities" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tất nhiên, `LEFT OUTER JOIN` cũng khả dụng bằng cách đặt `how=\"left\"`: chỉ các thành phố có trong `DataFrame` bên trái mới có kết quả. Tương tự, với `how=\"right\"`, chỉ các thành phố ở bên phải `DataFrame` mới xuất hiện trong kết quả. Ví dụ:" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
state_xcitylatlngpopulationstate_y
0CASan Francisco37.781334-122.416728808976California
1NYNew York40.705649-74.0083448363710New-York
2FLMiami25.791100-80.320733413201Florida
3NaNHoustonNaNNaN2242193Texas
\n", "
" ], "text/plain": [ " state_x city lat lng population state_y\n", "0 CA San Francisco 37.781334 -122.416728 808976 California\n", "1 NY New York 40.705649 -74.008344 8363710 New-York\n", "2 FL Miami 25.791100 -80.320733 413201 Florida\n", "3 NaN Houston NaN NaN 2242193 Texas" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left=city_loc, right=city_pop, on=\"city\", how=\"right\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nếu khóa gộp nằm trong một (hoặc cả hai) chỉ mục của `DataFrame`, thì bạn phải sử dụng `left_index=True` và/hoặc `right_index=True`. Nếu các tên cột chính khác nhau, bạn phải sử dụng `left_on` và `right_on`. Ví dụ:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
state_xcitylatlngpopulationnamestate_y
0CASan Francisco37.781334-122.416728808976San FranciscoCalifornia
1NYNew York40.705649-74.0083448363710New YorkNew-York
2FLMiami25.791100-80.320733413201MiamiFlorida
\n", "
" ], "text/plain": [ " state_x city lat lng population name \\\n", "0 CA San Francisco 37.781334 -122.416728 808976 San Francisco \n", "1 NY New York 40.705649 -74.008344 8363710 New York \n", "2 FL Miami 25.791100 -80.320733 413201 Miami \n", "\n", " state_y \n", "0 California \n", "1 New-York \n", "2 Florida " ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_pop2 = city_pop.copy()\n", "city_pop2.columns = [\"population\", \"name\", \"state\"]\n", "pd.merge(left=city_loc, right=city_pop2, left_on=\"city\", right_on=\"name\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Nối\n", "Thay vì gộp `DataFrame`, chúng ta có thể chỉ muốn nối chúng. Ta có thể sử dụng `concat()` cho mục đích này:" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
citylatlngpopulationstate
0San Francisco37.781334-122.416728NaNCA
1New York40.705649-74.008344NaNNY
2Miami25.791100-80.320733NaNFL
3Cleveland41.473508-81.739791NaNOH
4Salt Lake City40.755851-111.896657NaNUT
3San FranciscoNaNNaN808976.0California
4New YorkNaNNaN8363710.0New-York
5MiamiNaNNaN413201.0Florida
6HoustonNaNNaN2242193.0Texas
\n", "
" ], "text/plain": [ " city lat lng population state\n", "0 San Francisco 37.781334 -122.416728 NaN CA\n", "1 New York 40.705649 -74.008344 NaN NY\n", "2 Miami 25.791100 -80.320733 NaN FL\n", "3 Cleveland 41.473508 -81.739791 NaN OH\n", "4 Salt Lake City 40.755851 -111.896657 NaN UT\n", "3 San Francisco NaN NaN 808976.0 California\n", "4 New York NaN NaN 8363710.0 New-York\n", "5 Miami NaN NaN 413201.0 Florida\n", "6 Houston NaN NaN 2242193.0 Texas" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_concat = pd.concat([city_loc, city_pop])\n", "result_concat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng thao tác này đã căn chỉnh dữ liệu theo chiều ngang (theo cột) nhưng không theo chiều dọc (theo hàng). Trong ví dụ này, chúng ta kết thúc bằng nhiều hàng có cùng chỉ mục (ví dụ: 3). Pandas xử lý việc này khá duyên dáng:" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
citylatlngpopulationstate
3Cleveland41.473508-81.739791NaNOH
3San FranciscoNaNNaN808976.0California
\n", "
" ], "text/plain": [ " city lat lng population state\n", "3 Cleveland 41.473508 -81.739791 NaN OH\n", "3 San Francisco NaN NaN 808976.0 California" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result_concat.loc[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hoặc bạn có thể yêu cầu pandas bỏ qua chỉ mục:" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
citylatlngpopulationstate
0San Francisco37.781334-122.416728NaNCA
1New York40.705649-74.008344NaNNY
2Miami25.791100-80.320733NaNFL
3Cleveland41.473508-81.739791NaNOH
4Salt Lake City40.755851-111.896657NaNUT
5San FranciscoNaNNaN808976.0California
6New YorkNaNNaN8363710.0New-York
7MiamiNaNNaN413201.0Florida
8HoustonNaNNaN2242193.0Texas
\n", "
" ], "text/plain": [ " city lat lng population state\n", "0 San Francisco 37.781334 -122.416728 NaN CA\n", "1 New York 40.705649 -74.008344 NaN NY\n", "2 Miami 25.791100 -80.320733 NaN FL\n", "3 Cleveland 41.473508 -81.739791 NaN OH\n", "4 Salt Lake City 40.755851 -111.896657 NaN UT\n", "5 San Francisco NaN NaN 808976.0 California\n", "6 New York NaN NaN 8363710.0 New-York\n", "7 Miami NaN NaN 413201.0 Florida\n", "8 Houston NaN NaN 2242193.0 Texas" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([city_loc, city_pop], ignore_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng khi một cột không tồn tại trong `DataFrame`, nó sẽ hoạt động như thể nó chứa đầy các giá trị `NaN`. Nếu chúng ta đặt `join=\"inner\"`, thì chỉ các cột tồn tại trong *cả hai* `DataFrame` được trả về:" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statecity
0CASan Francisco
1NYNew York
2FLMiami
3OHCleveland
4UTSalt Lake City
3CaliforniaSan Francisco
4New-YorkNew York
5FloridaMiami
6TexasHouston
\n", "
" ], "text/plain": [ " state city\n", "0 CA San Francisco\n", "1 NY New York\n", "2 FL Miami\n", "3 OH Cleveland\n", "4 UT Salt Lake City\n", "3 California San Francisco\n", "4 New-York New York\n", "5 Florida Miami\n", "6 Texas Houston" ] }, "execution_count": 144, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([city_loc, city_pop], join=\"inner\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bạn có thể nối `DataFrame` theo chiều ngang thay vì theo chiều dọc bằng cách đặt `axis=1`:" ] }, { "cell_type": "code", "execution_count": 145, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statecitylatlngpopulationcitystate
0CASan Francisco37.781334-122.416728NaNNaNNaN
1NYNew York40.705649-74.008344NaNNaNNaN
2FLMiami25.791100-80.320733NaNNaNNaN
3OHCleveland41.473508-81.739791808976.0San FranciscoCalifornia
4UTSalt Lake City40.755851-111.8966578363710.0New YorkNew-York
5NaNNaNNaNNaN413201.0MiamiFlorida
6NaNNaNNaNNaN2242193.0HoustonTexas
\n", "
" ], "text/plain": [ " state city lat lng population city \\\n", "0 CA San Francisco 37.781334 -122.416728 NaN NaN \n", "1 NY New York 40.705649 -74.008344 NaN NaN \n", "2 FL Miami 25.791100 -80.320733 NaN NaN \n", "3 OH Cleveland 41.473508 -81.739791 808976.0 San Francisco \n", "4 UT Salt Lake City 40.755851 -111.896657 8363710.0 New York \n", "5 NaN NaN NaN NaN 413201.0 Miami \n", "6 NaN NaN NaN NaN 2242193.0 Houston \n", "\n", " state \n", "0 NaN \n", "1 NaN \n", "2 NaN \n", "3 California \n", "4 New-York \n", "5 Florida \n", "6 Texas " ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([city_loc, city_pop], axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Trong trường hợp này, nó thực sự không có nhiều ý nghĩa bởi vì các chỉ số không thẳng hàng (ví dụ: Cleveland và San Francisco nằm trên cùng một hàng, vì chúng có chung nhãn chỉ mục `3`). Vì vậy, hãy lập chỉ mục lại `DataFrame` theo tên thành phố trước khi nối:" ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
statelatlngpopulationstate
ClevelandOH41.473508-81.739791NaNNaN
HoustonNaNNaNNaN2242193.0Texas
MiamiFL25.791100-80.320733413201.0Florida
New YorkNY40.705649-74.0083448363710.0New-York
Salt Lake CityUT40.755851-111.896657NaNNaN
San FranciscoCA37.781334-122.416728808976.0California
\n", "
" ], "text/plain": [ " state lat lng population state\n", "Cleveland OH 41.473508 -81.739791 NaN NaN\n", "Houston NaN NaN NaN 2242193.0 Texas\n", "Miami FL 25.791100 -80.320733 413201.0 Florida\n", "New York NY 40.705649 -74.008344 8363710.0 New-York\n", "Salt Lake City UT 40.755851 -111.896657 NaN NaN\n", "San Francisco CA 37.781334 -122.416728 808976.0 California" ] }, "execution_count": 146, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([city_loc.set_index(\"city\"), city_pop.set_index(\"city\")], axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cái này trông rất giống `FULL OUTER JOIN`, ngoại trừ việc các cột `state` không được đổi tên thành `state_x` và `state_y`, và cột `city` hiện là chỉ mục." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Phương thức `append()` là một cách viết tắt hữu ích để nối các `DataFrame` theo chiều dọc:" ] }, { "cell_type": "code", "execution_count": 147, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
citylatlngpopulationstate
0San Francisco37.781334-122.416728NaNCA
1New York40.705649-74.008344NaNNY
2Miami25.791100-80.320733NaNFL
3Cleveland41.473508-81.739791NaNOH
4Salt Lake City40.755851-111.896657NaNUT
3San FranciscoNaNNaN808976.0California
4New YorkNaNNaN8363710.0New-York
5MiamiNaNNaN413201.0Florida
6HoustonNaNNaN2242193.0Texas
\n", "
" ], "text/plain": [ " city lat lng population state\n", "0 San Francisco 37.781334 -122.416728 NaN CA\n", "1 New York 40.705649 -74.008344 NaN NY\n", "2 Miami 25.791100 -80.320733 NaN FL\n", "3 Cleveland 41.473508 -81.739791 NaN OH\n", "4 Salt Lake City 40.755851 -111.896657 NaN UT\n", "3 San Francisco NaN NaN 808976.0 California\n", "4 New York NaN NaN 8363710.0 New-York\n", "5 Miami NaN NaN 413201.0 Florida\n", "6 Houston NaN NaN 2242193.0 Texas" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_loc.append(city_pop)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Như mọi khi trong pandas, phương thức `append()` *không* thực sự sửa đổi `city_loc`: nó hoạt động trên một bản sao và trả về bản sao đã sửa đổi." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Danh mục\n", "Sẽ khá thường xuyên ta có các giá trị đại diện cho các danh mục, ví dụ: `1` cho nữ và `2` cho nam hoặc `\"A\"` cho Tốt, `\"B\"` cho Trung bình, `\"C\"` cho Kém. Các giá trị phân loại này có thể khó đọc và khó xử lý, nhưng may mắn thay, pandas làm cho nó trở nên dễ dàng. Để minh họa điều này, hãy lấy `DataFrame` `city_pop` mà chúng ta đã tạo trước đó và thêm một cột đại diện cho một danh mục:" ] }, { "cell_type": "code", "execution_count": 148, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
populationcitystateeco_code
3808976San FranciscoCalifornia17
48363710New YorkNew-York17
5413201MiamiFlorida34
62242193HoustonTexas20
\n", "
" ], "text/plain": [ " population city state eco_code\n", "3 808976 San Francisco California 17\n", "4 8363710 New York New-York 17\n", "5 413201 Miami Florida 34\n", "6 2242193 Houston Texas 20" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_eco = city_pop.copy()\n", "city_eco[\"eco_code\"] = [17, 17, 34, 20]\n", "city_eco" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hiện tại, cột `eco_code` chứa đầy các mã rõ ràng là vô nghĩa. Hãy khắc phục điều đó. Đầu tiên, chúng ta sẽ tạo một cột phân loại mới dựa trên `eco_code`:" ] }, { "cell_type": "code", "execution_count": 149, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Int64Index([17, 20, 34], dtype='int64')" ] }, "execution_count": 149, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_eco[\"economy\"] = city_eco[\"eco_code\"].astype('category')\n", "city_eco[\"economy\"].cat.categories" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bây giờ chúng ta có thể đặt cho mỗi danh mục một cái tên có ý nghĩa:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
populationcitystateeco_codeeconomy
3808976San FranciscoCalifornia17Finance
48363710New YorkNew-York17Finance
5413201MiamiFlorida34Tourism
62242193HoustonTexas20Energy
\n", "
" ], "text/plain": [ " population city state eco_code economy\n", "3 808976 San Francisco California 17 Finance\n", "4 8363710 New York New-York 17 Finance\n", "5 413201 Miami Florida 34 Tourism\n", "6 2242193 Houston Texas 20 Energy" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_eco[\"economy\"].cat.categories = [\"Finance\", \"Energy\", \"Tourism\"]\n", "city_eco" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lưu ý rằng các giá trị phân loại được sắp xếp theo thứ tự phân loại của chúng, *không phải* thứ tự bảng chữ cái:" ] }, { "cell_type": "code", "execution_count": 151, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
populationcitystateeco_codeeconomy
5413201MiamiFlorida34Tourism
62242193HoustonTexas20Energy
48363710New YorkNew-York17Finance
3808976San FranciscoCalifornia17Finance
\n", "
" ], "text/plain": [ " population city state eco_code economy\n", "5 413201 Miami Florida 34 Tourism\n", "6 2242193 Houston Texas 20 Energy\n", "4 8363710 New York New-York 17 Finance\n", "3 808976 San Francisco California 17 Finance" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "source": [ "city_eco.sort_values(by=\"economy\", ascending=False)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Tiếp theo là gì?\n", "Như bạn có thể nhận thấy, pandas là một thư viện lớn với *nhiều* tính năng. Mặc dù chúng ta đã xem qua các tính năng quan trọng nhất nhưng vẫn còn rất nhiều điều cần khám phá. Có lẽ cách tốt nhất để tìm hiểu thêm là thực hành với một số dữ liệu thực tế. Bạn cũng nên tham khảo [tài liệu](http://pandas.pydata.org/pandas-docs/stable/index.html) tuyệt vời này của pandas, đặc biệt là [cuốn sách này](http://pandas.pydata.org/pandas-docs/stable/cookbook.htm)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" }, "toc": { "toc_cell": false, "toc_number_sections": true, "toc_section_display": "none", "toc_threshold": 6, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }