{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas是基于Numpy创建的Python库,为Python提供了易于使用的数据结构和数据分析工具。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "使用以下语句导入Pandas库:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pandas数据结构" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Series - 序列" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "存储任意类型数据的一维数组" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "s = pd.Series([3, -5, 7, 4], index=[\"a\", \"b\", \"c\", \"d\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DataFrame - 数据帧" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "data = {\n", " \"Country\": [\"Belgium\", \"India\", \"Brazil\"],\n", " \"Capital\": [\"Brussels\", \"New Delhi\", \"Brasília\"],\n", " \"Population\": [11190846, 1303171035, 207847528],\n", "}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(data, columns=[\"Country\", \"Capital\", \"Population\"])" ] }, { "cell_type": "code", "execution_count": 5, "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", "
CountryCapitalPopulation
0BelgiumBrussels11190846
1IndiaNew Delhi1303171035
2BrazilBrasília207847528
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "1 India New Delhi 1303171035\n", "2 Brazil Brasília 207847528" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 输入/输出" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 读取/写入CSV" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df.to_csv(\"../_tmp/df_to_csv.csv\", index=False)" ] }, { "cell_type": "code", "execution_count": 7, "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", "
CountryCapitalPopulation
0BelgiumBrussels11190846
1IndiaNew Delhi1303171035
2BrazilBrasília207847528
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "1 India New Delhi 1303171035\n", "2 Brazil Brasília 207847528" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_csv(\"../_tmp/df_to_csv.csv\", nrows=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 读取/写入Excel" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df.to_excel(\"../_tmp/df_to_excel.xlsx\", index=False, sheet_name=\"Sheet1\")" ] }, { "cell_type": "code", "execution_count": 9, "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", "
CountryCapitalPopulation
0BelgiumBrussels11190846
1IndiaNew Delhi1303171035
2BrazilBrasília207847528
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "1 India New Delhi 1303171035\n", "2 Brazil Brasília 207847528" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_excel(\"../_tmp/df_to_excel.xlsx\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "xlsx = pd.ExcelFile(\"../_tmp/df_to_excel.xlsx\") # 读取内含多个表的 Excel" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "df = pd.read_excel(xlsx, \"Sheet1\") # 读取多表 Excel 中的 Sheet1 表" ] }, { "cell_type": "code", "execution_count": 12, "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", "
CountryCapitalPopulation
0BelgiumBrussels11190846
1IndiaNew Delhi1303171035
2BrazilBrasília207847528
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "1 India New Delhi 1303171035\n", "2 Brazil Brasília 207847528" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 筛选数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 取值" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-5" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[\"b\"] # 取序列的值" ] }, { "cell_type": "code", "execution_count": 13, "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", "
CountryCapitalPopulation
1IndiaNew Delhi1303171035
2BrazilBrasília207847528
\n", "
" ], "text/plain": [ " Country Capital Population\n", "1 India New Delhi 1303171035\n", "2 Brazil Brasília 207847528" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[1:] # 取数据帧的子集" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 选取、布尔索引及设置值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**按位置**" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Country
0Belgium
\n", "
" ], "text/plain": [ " Country\n", "0 Belgium" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[[0], [0]] # 按行与列的位置选择某值" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Belgium'" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iat[0, 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**按标签**" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Country
0Belgium
\n", "
" ], "text/plain": [ " Country\n", "0 Belgium" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[[0], [\"Country\"]] # 按行与列的名称选择某值" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Belgium'" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.at[0, \"Country\"] # 按行与列的名称选择某值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**按标签/位置**" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Country Brazil\n", "Capital Brasília\n", "Population 207847528\n", "Name: 2, dtype: object" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[2] # 选择某行" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Brussels\n", "1 New Delhi\n", "2 Brasília\n", "Name: Capital, dtype: object" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:, \"Capital\"] # 选择某列" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'New Delhi'" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[1, \"Capital\"] # 按行列取值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**布尔索引**" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "b -5\n", "dtype: int64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[~(s > 1)] # 序列 S 中没有大于 1 的值" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 3\n", "b -5\n", "c 7\n", "d 4\n", "dtype: int64" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[(s < -1) | (s > 2)] # 序列 S 中小于 -1 或大于 2 的值" ] }, { "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", "
CountryCapitalPopulation
1IndiaNew Delhi1303171035
\n", "
" ], "text/plain": [ " Country Capital Population\n", "1 India New Delhi 1303171035" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df[\"Population\"] > 1200000000] # 选择数据帧中 Population 大于 12 亿的数据" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CountryCapital
1IndiaNew Delhi
\n", "
" ], "text/plain": [ " Country Capital\n", "1 India New Delhi" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[\n", " df[\"Population\"] > 1200000000, [\"Country\", \"Capital\"]\n", "] # 选择数据帧中人口大于 12 亿的数据 'Country' 和 'Capital' 字段" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**设置值**" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "s[\"a\"] = 6 # 将序列 s 中索引为 a 的值设为 6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 删除数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**通过drop函数删除数据**" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "b -5\n", "d 4\n", "dtype: int64" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.drop([\"a\", \"c\"]) # 按索引删除序列的值 (axis=0)" ] }, { "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", "
CapitalPopulation
0Brussels11190846
1New Delhi1303171035
2Brasília207847528
\n", "
" ], "text/plain": [ " Capital Population\n", "0 Brussels 11190846\n", "1 New Delhi 1303171035\n", "2 Brasília 207847528" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.drop(\"Country\", axis=1) # 按列名删除数据帧的列 (axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 排序和排名" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**根据索引或者值进行排序**" ] }, { "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", "
CountryCapitalPopulation
0BelgiumBrussels11190846
1IndiaNew Delhi1303171035
2BrazilBrasília207847528
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "1 India New Delhi 1303171035\n", "2 Brazil Brasília 207847528" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index() # 按索引排序" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CountryCapitalPopulation
0BelgiumBrussels11190846
2BrazilBrasília207847528
1IndiaNew Delhi1303171035
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "2 Brazil Brasília 207847528\n", "1 India New Delhi 1303171035" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by=\"Country\") # 按某列的值排序" ] }, { "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", "
CountryCapitalPopulation
01.02.01.0
13.03.03.0
22.01.02.0
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 1.0 2.0 1.0\n", "1 3.0 3.0 3.0\n", "2 2.0 1.0 2.0" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.rank() # 数据帧排名" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 查询信息与计算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 基本信息" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3, 3)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape # (行,列)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=3, step=1)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index # 获取索引" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Country', 'Capital', 'Population'], dtype='object')" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns # 获取列名" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 3 entries, 0 to 2\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 Country 3 non-null object\n", " 1 Capital 3 non-null object\n", " 2 Population 3 non-null int64 \n", "dtypes: int64(1), object(2)\n", "memory usage: 200.0+ bytes\n" ] } ], "source": [ "df.info() # 获取数据帧基本信息" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Country 3\n", "Capital 3\n", "Population 3\n", "dtype: int64" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.count() # 非 Na 值的数量" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 汇总" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Country BelgiumIndiaBrazil\n", "Capital BrusselsNew DelhiBrasília\n", "Population 1522209409\n", "dtype: object" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sum() # 合计" ] }, { "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", "
CountryCapitalPopulation
0BelgiumBrussels11190846
1BelgiumIndiaBrusselsNew Delhi1314361881
2BelgiumIndiaBrazilBrusselsNew DelhiBrasília1522209409
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 Belgium Brussels 11190846\n", "1 BelgiumIndia BrusselsNew Delhi 1314361881\n", "2 BelgiumIndiaBrazil BrusselsNew DelhiBrasília 1522209409" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.cumsum() # 累计" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.008587396204673933" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Population\"].min() / df[\"Population\"].max() # 最小值除以最大值" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Population\"].idxmin() / df[\"Population\"].idxmax() # 索引最小值除以索引最大值" ] }, { "cell_type": "code", "execution_count": 67, "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", "
Population
count3.000000e+00
mean5.074031e+08
std6.961346e+08
min1.119085e+07
25%1.095192e+08
50%2.078475e+08
75%7.555093e+08
max1.303171e+09
\n", "
" ], "text/plain": [ " Population\n", "count 3.000000e+00\n", "mean 5.074031e+08\n", "std 6.961346e+08\n", "min 1.119085e+07\n", "25% 1.095192e+08\n", "50% 2.078475e+08\n", "75% 7.555093e+08\n", "max 1.303171e+09" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe() # 基础统计数据" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\yanta\\AppData\\Local\\Temp\\ipykernel_42536\\1467810487.py:1: FutureWarning: The default value of numeric_only in DataFrame.mean is deprecated. In a future version, it will default to False. In addition, specifying 'numeric_only=None' is deprecated. Select only valid columns or specify the value of numeric_only to silence this warning.\n", " df.mean() #平均值\n" ] }, { "data": { "text/plain": [ "Population 5.074031e+08\n", "dtype: float64" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Population\"].mean() # 平均值" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\yanta\\AppData\\Local\\Temp\\ipykernel_42536\\2005239709.py:1: FutureWarning: The default value of numeric_only in DataFrame.median is deprecated. In a future version, it will default to False. In addition, specifying 'numeric_only=None' is deprecated. Select only valid columns or specify the value of numeric_only to silence this warning.\n", " df.median() #中位数\n" ] }, { "data": { "text/plain": [ "Population 207847528.0\n", "dtype: float64" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"Population\"].median() # 中位数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 应用函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**通过apply函数应用变换**" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "f = lambda x: x * 2 # 应用匿名函数 lambda" ] }, { "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", " \n", " \n", " \n", "
CountryCapitalPopulation
0BelgiumBelgiumBrusselsBrussels22381692
1IndiaIndiaNew DelhiNew Delhi2606342070
2BrazilBrazilBrasíliaBrasília415695056
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 BelgiumBelgium BrusselsBrussels 22381692\n", "1 IndiaIndia New DelhiNew Delhi 2606342070\n", "2 BrazilBrazil BrasíliaBrasília 415695056" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(f) # 应用函数" ] }, { "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", " \n", " \n", " \n", "
CountryCapitalPopulation
0BelgiumBelgiumBrusselsBrussels22381692
1IndiaIndiaNew DelhiNew Delhi2606342070
2BrazilBrazilBrasíliaBrasília415695056
\n", "
" ], "text/plain": [ " Country Capital Population\n", "0 BelgiumBelgium BrusselsBrussels 22381692\n", "1 IndiaIndia New DelhiNew Delhi 2606342070\n", "2 BrazilBrazil BrasíliaBrasília 415695056" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.applymap(f) # 对每个单元格应用函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据对齐" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 内部数据对齐" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**如有不一致的索引,则使用NA值:**" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [], "source": [ "s3 = pd.Series([7, -2, 3], index=[\"a\", \"c\", \"d\"])" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 13.0\n", "b NaN\n", "c 5.0\n", "d 7.0\n", "dtype: float64" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s + s3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 使用 Fill 方法运算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**还可以使用 Fill 方法****补齐缺失后再****运算:**" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 13.0\n", "b -5.0\n", "c 5.0\n", "d 7.0\n", "dtype: float64" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.add(s3, fill_value=0)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a -1.0\n", "b -7.0\n", "c 9.0\n", "d 1.0\n", "dtype: float64" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.sub(s3, fill_value=2)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 0.857143\n", "b -1.250000\n", "c -3.500000\n", "d 1.333333\n", "dtype: float64" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.div(s3, fill_value=4)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 42.0\n", "b -15.0\n", "c -14.0\n", "d 12.0\n", "dtype: float64" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.mul(s3, fill_value=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据重塑" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "df2 = pd.DataFrame(\n", " {\n", " \"Date\": [\n", " \"2021-12-25\",\n", " \"2021-12-26\",\n", " \"2021-12-25\",\n", " \"2021-12-27\",\n", " \"2021-12-26\",\n", " \"2021-12-27\",\n", " ],\n", " \"Type\": [\"a\", \"b\", \"c\", \"a\", \"a\", \"c\"],\n", " \"Value\": [1.34, 10.2, 20.43, 50.31, 0.26, 20.64],\n", " }\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 透视" ] }, { "cell_type": "code", "execution_count": 2, "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", "
Typeabc
Date
2021-12-251.34NaN20.43
2021-12-260.2610.2NaN
2021-12-2750.31NaN20.64
\n", "
" ], "text/plain": [ "Type a b c\n", "Date \n", "2021-12-25 1.34 NaN 20.43\n", "2021-12-26 0.26 10.2 NaN\n", "2021-12-27 50.31 NaN 20.64" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3 = df2.pivot(index=\"Date\", columns=\"Type\", values=\"Value\") # 将行变为列\n", "df3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 透视表" ] }, { "cell_type": "code", "execution_count": 3, "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", "
Typeabc
Date
2021-12-251.34NaN20.43
2021-12-260.2610.2NaN
2021-12-2750.31NaN20.64
\n", "
" ], "text/plain": [ "Type a b c\n", "Date \n", "2021-12-25 1.34 NaN 20.43\n", "2021-12-26 0.26 10.2 NaN\n", "2021-12-27 50.31 NaN 20.64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4 = pd.pivot_table(df2, values=\"Value\", index=\"Date\", columns=\"Type\") # 将行变为列\n", "df4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 堆叠(轴旋转)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 Date 2021-12-25\n", " Type a\n", " Value 1.34\n", "1 Date 2021-12-26\n", " Type b\n", " Value 10.2\n", "2 Date 2021-12-25\n", " Type c\n", " Value 20.43\n", "3 Date 2021-12-27\n", " Type a\n", " Value 50.31\n", "4 Date 2021-12-26\n", " Type a\n", " Value 0.26\n", "5 Date 2021-12-27\n", " Type c\n", " Value 20.64\n", "dtype: object" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked = df2.stack() # 透视列标签\n", "stacked" ] }, { "cell_type": "code", "execution_count": 5, "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", "
DateTypeValue
02021-12-25a1.34
12021-12-26b10.2
22021-12-25c20.43
32021-12-27a50.31
42021-12-26a0.26
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Date Type Value\n", "0 2021-12-25 a 1.34\n", "1 2021-12-26 b 10.2\n", "2 2021-12-25 c 20.43\n", "3 2021-12-27 a 50.31\n", "4 2021-12-26 a 0.26\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack() # 透视索引标签" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 融合/Melt" ] }, { "cell_type": "code", "execution_count": 6, "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", "
DatevariableObservations
02021-12-25Typea
12021-12-26Typeb
22021-12-25Typec
32021-12-27Typea
42021-12-26Typea
52021-12-27Typec
62021-12-25Value1.34
72021-12-26Value10.2
82021-12-25Value20.43
92021-12-27Value50.31
102021-12-26Value0.26
112021-12-27Value20.64
\n", "
" ], "text/plain": [ " Date variable Observations\n", "0 2021-12-25 Type a\n", "1 2021-12-26 Type b\n", "2 2021-12-25 Type c\n", "3 2021-12-27 Type a\n", "4 2021-12-26 Type a\n", "5 2021-12-27 Type c\n", "6 2021-12-25 Value 1.34\n", "7 2021-12-26 Value 10.2\n", "8 2021-12-25 Value 20.43\n", "9 2021-12-27 Value 50.31\n", "10 2021-12-26 Value 0.26\n", "11 2021-12-27 Value 20.64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.melt(\n", " df2, id_vars=[\"Date\"], value_vars=[\"Type\", \"Value\"], value_name=\"Observations\"\n", ") # 将列转为行" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 迭代" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**迭代遍历数据帧**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.items() # (列索引, 序列) 键值对" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.iterrows() # (行索引, 序列) 键值对" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 高级索引" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " **基础选择**" ] }, { "cell_type": "code", "execution_count": 9, "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", "
Typeabc
Date
2021-12-251.34NaN20.43
2021-12-260.2610.2NaN
2021-12-2750.31NaN20.64
\n", "
" ], "text/plain": [ "Type a b c\n", "Date \n", "2021-12-25 1.34 NaN 20.43\n", "2021-12-26 0.26 10.2 NaN\n", "2021-12-27 50.31 NaN 20.64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.loc[:, (df3 > 1).any()] # 选择任一值大于 1 的列" ] }, { "cell_type": "code", "execution_count": 10, "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", "
Type
Date
2021-12-25
2021-12-26
2021-12-27
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: []\n", "Index: [2021-12-25, 2021-12-26, 2021-12-27]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.loc[:, (df3 > 1).all()] # 选择所有值大于 1 的列" ] }, { "cell_type": "code", "execution_count": 11, "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", "
Typebc
Date
2021-12-25NaN20.43
2021-12-2610.2NaN
2021-12-27NaN20.64
\n", "
" ], "text/plain": [ "Type b c\n", "Date \n", "2021-12-25 NaN 20.43\n", "2021-12-26 10.2 NaN\n", "2021-12-27 NaN 20.64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.loc[:, df3.isnull().any()] # 选择含 NaN 值的列" ] }, { "cell_type": "code", "execution_count": 12, "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", "
Typea
Date
2021-12-251.34
2021-12-260.26
2021-12-2750.31
\n", "
" ], "text/plain": [ "Type a\n", "Date \n", "2021-12-25 1.34\n", "2021-12-26 0.26\n", "2021-12-27 50.31" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.loc[:, df3.notnull().all()] # 选择不含 NaN 值的列" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " **通过isin选择**" ] }, { "cell_type": "code", "execution_count": 13, "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", "
DateTypeValue
12021-12-26b10.20
22021-12-25c20.43
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Date Type Value\n", "1 2021-12-26 b 10.20\n", "2 2021-12-25 c 20.43\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2[(df2.Type.isin([\"b\", \"c\"]))] # 选择指定列为某一类型的数值" ] }, { "cell_type": "code", "execution_count": 14, "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", "
Typeab
Date
2021-12-251.34NaN
2021-12-260.2610.2
2021-12-2750.31NaN
\n", "
" ], "text/plain": [ "Type a b\n", "Date \n", "2021-12-25 1.34 NaN\n", "2021-12-26 0.26 10.2\n", "2021-12-27 50.31 NaN" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.filter(items=[\"a\", \"b\"]) # 选择特定值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " **通过where选择**" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 NaN\n", "1 3.0\n", "2 NaN\n", "3 7.0\n", "4 4.0\n", "dtype: float64" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([-1, 3, -5, 7, 4])\n", "s.where(s > 0) # 选择子集" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " **通过query选择**" ] }, { "cell_type": "code", "execution_count": 16, "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", "
DateTypeValue
12021-12-26b10.20
22021-12-25c20.43
32021-12-27a50.31
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Date Type Value\n", "1 2021-12-26 b 10.20\n", "2 2021-12-25 c 20.43\n", "3 2021-12-27 a 50.31\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.query(\"Value > 10\") # 查询 DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 设置/取消索引" ] }, { "cell_type": "code", "execution_count": 17, "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", "
TypeValue
Date
2021-12-25a1.34
2021-12-26b10.20
2021-12-25c20.43
2021-12-27a50.31
2021-12-26a0.26
2021-12-27c20.64
\n", "
" ], "text/plain": [ " Type Value\n", "Date \n", "2021-12-25 a 1.34\n", "2021-12-26 b 10.20\n", "2021-12-25 c 20.43\n", "2021-12-27 a 50.31\n", "2021-12-26 a 0.26\n", "2021-12-27 c 20.64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.set_index(\"Date\") # 设置索引" ] }, { "cell_type": "code", "execution_count": 18, "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", "
indexDateTypeValue
002021-12-25a1.34
112021-12-26b10.20
222021-12-25c20.43
332021-12-27a50.31
442021-12-26a0.26
552021-12-27c20.64
\n", "
" ], "text/plain": [ " index Date Type Value\n", "0 0 2021-12-25 a 1.34\n", "1 1 2021-12-26 b 10.20\n", "2 2 2021-12-25 c 20.43\n", "3 3 2021-12-27 a 50.31\n", "4 4 2021-12-26 a 0.26\n", "5 5 2021-12-27 c 20.64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.reset_index() # 重置索引 0 ~ n" ] }, { "cell_type": "code", "execution_count": 19, "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", "
TimeCategoryNumber
02021-12-25a1.34
12021-12-26b10.20
22021-12-25c20.43
32021-12-27a50.31
42021-12-26a0.26
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Time Category Number\n", "0 2021-12-25 a 1.34\n", "1 2021-12-26 b 10.20\n", "2 2021-12-25 c 20.43\n", "3 2021-12-27 a 50.31\n", "4 2021-12-26 a 0.26\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.rename(\n", " index=str, columns={\"Date\": \"Time\", \"Type\": \"Category\", \"Value\": \"Number\"}\n", ") # 重命名 DataFrame 列名" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 重设索引" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 -1\n", "1 3\n", "2 -5\n", "3 7\n", "4 4\n", "dtype: int64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 3\n", "3 7\n", "0 -1\n", "2 -5\n", "4 4\n", "dtype: int64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2 = s.reindex([1, 3, 0, 2, 4])\n", "s2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**前向填充**" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 1.0\n", "5 4.0\n", "6 5.0\n", "9 NaN\n", "10 NaN\n", "3 2.0\n", "dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "s = pd.Series(range(0, 6), index=range(1, 7))\n", "s.reindex([2, 5, 6, 9, 10, 3])" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 1\n", "5 4\n", "6 5\n", "9 5\n", "10 5\n", "3 2\n", "dtype: int64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.reindex([2, 5, 6, 9, 10, 3], method=\"ffill\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**后向填充**" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 1.0\n", "5 4.0\n", "6 5.0\n", "9 NaN\n", "10 NaN\n", "3 2.0\n", "dtype: float64" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.reindex([2, 5, 6, 9, 10, 3], method=\"bfill\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 多重索引" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "arrays = [np.array([1, 2, 3]), np.array([5, 4, 3])]" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "df5 = pd.DataFrame(np.random.rand(3, 2), index=arrays)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "tuples = list(zip(*arrays))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "index = pd.MultiIndex.from_tuples(tuples, names=[\"first\", \"second\"])" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "df6 = pd.DataFrame(np.random.rand(3, 2), index=index)" ] }, { "cell_type": "code", "execution_count": 30, "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", "
Value
DateType
2021-12-25a1.34
2021-12-26b10.20
2021-12-25c20.43
2021-12-27a50.31
2021-12-26a0.26
2021-12-27c20.64
\n", "
" ], "text/plain": [ " Value\n", "Date Type \n", "2021-12-25 a 1.34\n", "2021-12-26 b 10.20\n", "2021-12-25 c 20.43\n", "2021-12-27 a 50.31\n", "2021-12-26 a 0.26\n", "2021-12-27 c 20.64" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.set_index([\"Date\", \"Type\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据滤重" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**数据帧自带一系列函数对数据重复值进行处理**" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 3, 5, 2], dtype=int64)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s3 = pd.Series([1, 3, 5, 2, 1, 3, 3])\n", "s3.unique() # 返回唯一值" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 False\n", "2 False\n", "3 True\n", "4 True\n", "5 True\n", "dtype: bool" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.duplicated(\"Type\") # 查找重复值" ] }, { "cell_type": "code", "execution_count": 33, "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", "
DateTypeValue
12021-12-26b10.20
42021-12-26a0.26
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Date Type Value\n", "1 2021-12-26 b 10.20\n", "4 2021-12-26 a 0.26\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.drop_duplicates(\"Type\", keep=\"last\") # 去除重复值" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([False, False, False, False, False, False])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.index.duplicated() # 查找重复索引" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据分组" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**分组聚合**" ] }, { "cell_type": "code", "execution_count": 35, "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", "
Value
DateType
2021-12-25a1.34
c20.43
2021-12-26a0.26
b10.20
2021-12-27a50.31
c20.64
\n", "
" ], "text/plain": [ " Value\n", "Date Type \n", "2021-12-25 a 1.34\n", " c 20.43\n", "2021-12-26 a 0.26\n", " b 10.20\n", "2021-12-27 a 50.31\n", " c 20.64" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.groupby(by=[\"Date\", \"Type\"]).mean() # 分组求均值" ] }, { "cell_type": "code", "execution_count": 36, "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", "
Typeabc
Date
2021-12-251.340.020.43
2021-12-260.2610.20.00
2021-12-2750.310.020.64
\n", "
" ], "text/plain": [ "Type a b c\n", "Date \n", "2021-12-25 1.34 0.0 20.43\n", "2021-12-26 0.26 10.2 0.00\n", "2021-12-27 50.31 0.0 20.64" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.groupby(level=0).sum()" ] }, { "cell_type": "code", "execution_count": 37, "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", "
Typeab
Date
2021-12-251.340.0
2021-12-260.2610.2
2021-12-2750.310.0
\n", "
" ], "text/plain": [ "Type a b\n", "Date \n", "2021-12-25 1.34 0.0\n", "2021-12-26 0.26 10.2\n", "2021-12-27 50.31 0.0" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.groupby(level=0).agg({\"a\": lambda x: sum(x) / len(x), \"b\": np.sum})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**转换**" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "customSum = lambda x: (x + x % 2)" ] }, { "cell_type": "code", "execution_count": 39, "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", "
Typeabc
Date
2021-12-252.68NaN20.86
2021-12-260.5210.4NaN
2021-12-2750.62NaN21.28
\n", "
" ], "text/plain": [ "Type a b c\n", "Date \n", "2021-12-25 2.68 NaN 20.86\n", "2021-12-26 0.52 10.4 NaN\n", "2021-12-27 50.62 NaN 21.28" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df4.groupby(level=0).transform(customSum)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 缺失值" ] }, { "cell_type": "code", "execution_count": 40, "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", "
DateTypeValue
02021-12-25a1.34
12021-12-26b10.20
22021-12-25c20.43
32021-12-27a50.31
42021-12-26a0.26
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Date Type Value\n", "0 2021-12-25 a 1.34\n", "1 2021-12-26 b 10.20\n", "2 2021-12-25 c 20.43\n", "3 2021-12-27 a 50.31\n", "4 2021-12-26 a 0.26\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.dropna() # 去除缺失值 NaN" ] }, { "cell_type": "code", "execution_count": 41, "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", "
Typeabc
Date
2021-12-251.3410.220.430
2021-12-260.2610.220.535
2021-12-2750.3110.220.640
\n", "
" ], "text/plain": [ "Type a b c\n", "Date \n", "2021-12-25 1.34 10.2 20.430\n", "2021-12-26 0.26 10.2 20.535\n", "2021-12-27 50.31 10.2 20.640" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df3.fillna(df3.mean()) # 用预设值填充缺失值 NaN" ] }, { "cell_type": "code", "execution_count": 42, "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", "
DateTypeValue
02021-12-25f1.34
12021-12-26b10.20
22021-12-25c20.43
32021-12-27f50.31
42021-12-26f0.26
52021-12-27c20.64
\n", "
" ], "text/plain": [ " Date Type Value\n", "0 2021-12-25 f 1.34\n", "1 2021-12-26 b 10.20\n", "2 2021-12-25 c 20.43\n", "3 2021-12-27 f 50.31\n", "4 2021-12-26 f 0.26\n", "5 2021-12-27 c 20.64" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.replace(\"a\", \"f\") # 用一个值替换另一个值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 合并数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 合并-Merge" ] }, { "cell_type": "code", "execution_count": 43, "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", "
keyAB
0K0A0B0
1K1A1B1
2K2A2B2
3K3A3B3
\n", "
" ], "text/plain": [ " key A B\n", "0 K0 A0 B0\n", "1 K1 A1 B1\n", "2 K2 A2 B2\n", "3 K3 A3 B3" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 = pd.DataFrame(\n", " {\n", " \"key\": [\"K0\", \"K1\", \"K2\", \"K3\"],\n", " \"A\": [\"A0\", \"A1\", \"A2\", \"A3\"],\n", " \"B\": [\"B0\", \"B1\", \"B2\", \"B3\"],\n", " }\n", ")\n", "data1" ] }, { "cell_type": "code", "execution_count": 44, "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", "
keyCD
0K0C0D0
1K1C1D1
2K3C2D2
3K4C3D3
\n", "
" ], "text/plain": [ " key C D\n", "0 K0 C0 D0\n", "1 K1 C1 D1\n", "2 K3 C2 D2\n", "3 K4 C3 D3" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2 = pd.DataFrame(\n", " {\n", " \"key\": [\"K0\", \"K1\", \"K3\", \"K4\"],\n", " \"C\": [\"C0\", \"C1\", \"C2\", \"C3\"],\n", " \"D\": [\"D0\", \"D1\", \"D2\", \"D3\"],\n", " }\n", ")\n", "data2" ] }, { "cell_type": "code", "execution_count": 45, "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", "
keyABCD
0K0A0B0C0D0
1K1A1B1C1D1
2K2A2B2NaNNaN
3K3A3B3C2D2
\n", "
" ], "text/plain": [ " key A B C D\n", "0 K0 A0 B0 C0 D0\n", "1 K1 A1 B1 C1 D1\n", "2 K2 A2 B2 NaN NaN\n", "3 K3 A3 B3 C2 D2" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(data1, data2, how=\"left\", on=\"key\")" ] }, { "cell_type": "code", "execution_count": 46, "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", "
keyABCD
0K0A0B0C0D0
1K1A1B1C1D1
2K3A3B3C2D2
3K4NaNNaNC3D3
\n", "
" ], "text/plain": [ " key A B C D\n", "0 K0 A0 B0 C0 D0\n", "1 K1 A1 B1 C1 D1\n", "2 K3 A3 B3 C2 D2\n", "3 K4 NaN NaN C3 D3" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(data1, data2, how=\"right\", on=\"key\")" ] }, { "cell_type": "code", "execution_count": 47, "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", "
keyABCD
0K0A0B0C0D0
1K1A1B1C1D1
2K3A3B3C2D2
\n", "
" ], "text/plain": [ " key A B C D\n", "0 K0 A0 B0 C0 D0\n", "1 K1 A1 B1 C1 D1\n", "2 K3 A3 B3 C2 D2" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(data1, data2, how=\"inner\", on=\"key\")" ] }, { "cell_type": "code", "execution_count": 48, "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", "
keyABCD
0K0A0B0C0D0
1K1A1B1C1D1
2K2A2B2NaNNaN
3K3A3B3C2D2
4K4NaNNaNC3D3
\n", "
" ], "text/plain": [ " key A B C D\n", "0 K0 A0 B0 C0 D0\n", "1 K1 A1 B1 C1 D1\n", "2 K2 A2 B2 NaN NaN\n", "3 K3 A3 B3 C2 D2\n", "4 K4 NaN NaN C3 D3" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(data1, data2, how=\"outer\", on=\"key\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 连接-Join" ] }, { "cell_type": "code", "execution_count": 49, "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", "
key_1ABkey_2CD
0K0A0B0K0C0D0
1K1A1B1K1C1D1
2K2A2B2K3C2D2
3K3A3B3K4C3D3
\n", "
" ], "text/plain": [ " key_1 A B key_2 C D\n", "0 K0 A0 B0 K0 C0 D0\n", "1 K1 A1 B1 K1 C1 D1\n", "2 K2 A2 B2 K3 C2 D2\n", "3 K3 A3 B3 K4 C3 D3" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1.join(data2, how=\"right\", lsuffix=\"_1\", rsuffix=\"_2\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 拼接-Concatenate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**横向/纵向**" ] }, { "cell_type": "code", "execution_count": 51, "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", "
OneTwo
10.03.0
21.0-5.0
32.07.0
43.04.0
54.0NaN
65.0NaN
0NaN-1.0
\n", "
" ], "text/plain": [ " One Two\n", "1 0.0 3.0\n", "2 1.0 -5.0\n", "3 2.0 7.0\n", "4 3.0 4.0\n", "5 4.0 NaN\n", "6 5.0 NaN\n", "0 NaN -1.0" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([s, s2], axis=1, keys=[\"One\", \"Two\"])" ] }, { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keyABkeyCD
0K0A0B0K0C0D0
1K1A1B1K1C1D1
2K2A2B2K3C2D2
3K3A3B3K4C3D3
\n", "
" ], "text/plain": [ " key A B key C D\n", "0 K0 A0 B0 K0 C0 D0\n", "1 K1 A1 B1 K1 C1 D1\n", "2 K2 A2 B2 K3 C2 D2\n", "3 K3 A3 B3 K4 C3 D3" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat([data1, data2], axis=1, join=\"inner\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 日期转换" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**pandas包含对时间型数据变换与处理的函数**" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "df2[\"Date\"] = pd.to_datetime(df2[\"Date\"])" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "df2[\"Date\"] = pd.date_range(\"2021-12-25\", periods=6, freq=\"M\")" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "\n", "dates = [datetime.date(2021, 12, 25), datetime.date(2021, 12, 26)]" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "index = pd.DatetimeIndex(dates)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "index = pd.date_range(\n", " datetime.date(2021, 12, 25), end=datetime.date(2022, 12, 26), freq=\"BM\"\n", ")" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2021-12-31', '2022-01-31', '2022-02-28', '2022-03-31',\n", " '2022-04-29', '2022-05-31', '2022-06-30', '2022-07-29',\n", " '2022-08-31', '2022-09-30', '2022-10-31', '2022-11-30'],\n", " dtype='datetime64[ns]', freq='BM')" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 可视化" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Series和Dataframe都自带plot绘图功能**" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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pk+fTkVFxbcfJSUlTr+OjhGBzLolkUnX9WDBfwykQ3ig069DREREfl6TjkLatWuHj48PJ06c+M7nT5w4QceOP/5iUwEBAQQEBFz8wgt012VdXH4dIiIi8tOa9IiFv78//fv356OPPvr2cw6Hg48++ohBgwY5fZyIiIh4lia/QNbUqVO55557GDBgAJdddhl/+tOfqKmp4d5773XFPhEREfEgTQ6LcePGcfLkSR5//HGOHz9Oamoqa9as+cETOkVERKT1afLrWDSXK1/HQkRERFzjQu+/9cpRIiIi4jQKCxEREXEahYWIiIg4jcJCREREnEZhISIiIk6jsBARERGnUViIiIiI0ygsRERExGkUFiIiIuI0TX5J7+b65wt9VlZWtvRVi4iIyEX65/32z71gd4uHRVVVFQBxcXEtfdUiIiLSTFVVVURERJz391v8vUIcDgelpaWEhYVhsVic9udWVlYSFxdHSUmJ3oPEhXQ7txzd1i1Dt3PL0O3cMlx5OxuGQVVVFTExMVit538mRYs/YmG1WomNjXXZnx8eHq5v2hag27nl6LZuGbqdW4Zu55bhqtv5px6p+Cc9eVNEREScRmEhIiIiTuM1YREQEMDMmTMJCAgwe4pX0+3ccnRbtwzdzi1Dt3PLcIfbucWfvCkiIiLey2sesRARERHzKSxERETEaRQWIiIi4jQKCxEREXEajw+LTz/9lFGjRhETE4PFYmHFihVmT/JK2dnZXHrppYSFhREdHc2YMWPYvXu32bO8zvz580lOTv72xW0GDRrE6tWrzZ7l9WbPno3FYmHKlClmT/E6TzzxBBaL5TsfCQkJZs/ySkePHuUXv/gFUVFRBAUF0a9fPzZv3tziOzw+LGpqakhJSWHevHlmT/FqGzZsICsri6+//pp169bR0NDA8OHDqampMXuaV4mNjWX27Nls2bKFzZs3c9111zF69Gi2b99u9jSvtWnTJl555RWSk5PNnuK1EhMTOXbs2Lcfn3/+udmTvM7Zs2cZPHgwfn5+rF69mh07dvDCCy/Qtm3bFt/S4i/p7WwjRoxgxIgRZs/wemvWrPnOr998802io6PZsmULV111lUmrvM+oUaO+8+s//OEPzJ8/n6+//prExESTVnmv6upqxo8fz2uvvcbTTz9t9hyv5evrS8eOHc2e4dWeffZZ4uLieOONN779XLdu3UzZ4vGPWIg5KioqAIiMjDR5ifey2+0sWrSImpoaBg0aZPYcr5SVlcXIkSMZNmyY2VO82t69e4mJiaF79+6MHz+ew4cPmz3J67zzzjsMGDCAsWPHEh0dTVpaGq+99popWzz+EQtpeQ6HgylTpjB48GCSkpLMnuN1ioqKGDRoEHV1dYSGhrJ8+XL69u1r9iyvs2jRIvLy8ti0aZPZU7zawIEDefPNN+nduzfHjh1j1qxZDBkyhG3bthEWFmb2PK+xf/9+5s+fz9SpU5kxYwabNm1i0qRJ+Pv7c88997ToFoWFNFlWVhbbtm3TOamL9O7dm4KCAioqKli2bBn33HMPGzZsUFw4UUlJCZMnT2bdunUEBgaaPcer/ftRdXJyMgMHDiQ+Pp4lS5Zw3333mbjMuzgcDgYMGMAzzzwDQFpaGtu2beMvf/lLi4eFjkKkSSZMmMCqVav45JNPiI2NNXuOV/L396dHjx7079+f7OxsUlJSmDNnjtmzvMqWLVsoKysjPT0dX19ffH192bBhA3PnzsXX1xe73W72RK/Vpk0bevXqRXFxsdlTvEqnTp1+8I+PPn36mHLspEcs5IIYhsHEiRNZvnw569evN+1JQa2Rw+HAZrOZPcOrDB06lKKiou987t577yUhIYGHHnoIHx8fk5Z5v+rqavbt28cvf/lLs6d4lcGDB//gJQD27NlDfHx8i2/x+LCorq7+TvkeOHCAgoICIiMj6dKli4nLvEtWVha5ubmsXLmSsLAwjh8/DkBERARBQUEmr/Me06dPZ8SIEXTp0oWqqipyc3NZv349a9euNXuaVwkLC/vB84NCQkKIiorS84acbNq0aYwaNYr4+HhKS0uZOXMmPj4+ZGRkmD3NqzzwwANcccUVPPPMM9x5551s3LiRV199lVdffbXlxxge7pNPPjGAH3zcc889Zk/zKj92GwPGG2+8YfY0r/LrX//aiI+PN/z9/Y327dsbQ4cONT744AOzZ7UKV199tTF58mSzZ3idcePGGZ06dTL8/f2Nzp07G+PGjTOKi4vNnuWV3n33XSMpKckICAgwEhISjFdffdWUHXrbdBEREXEaPXlTREREnEZhISIiIk6jsBARERGnUViIiIiI0ygsRERExGkUFiIiIuI0CgsRERFxGoWFiIiIOI3CQkRERJxGYSEiIiJOo7AQERERp1FYiIiIiNP8f+ygH6u7hsIpAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "s.plot()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df2[\"Value\"].plot()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.11.4" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "calc(100% - 180px)", "left": "10px", "top": "150px", "width": "307.797px" }, "toc_section_display": true, "toc_window_display": true }, "vscode": { "interpreter": { "hash": "f7976576504ac6c456dadd405d7477574ca2a64265ee4724cfbc25daae5f6d94" } } }, "nbformat": 4, "nbformat_minor": 4 }