{
"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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
"
\n",
" \n",
"
\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",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 2 | \n",
" Brazil | \n",
" Brasília | \n",
" 207847528 | \n",
"
\n",
" \n",
" 1 | \n",
" India | \n",
" New Delhi | \n",
" 1303171035 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.0 | \n",
" 2.0 | \n",
" 1.0 | \n",
"
\n",
" \n",
" 1 | \n",
" 3.0 | \n",
" 3.0 | \n",
" 3.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 2.0 | \n",
" 1.0 | \n",
" 2.0 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Belgium | \n",
" Brussels | \n",
" 11190846 | \n",
"
\n",
" \n",
" 1 | \n",
" BelgiumIndia | \n",
" BrusselsNew Delhi | \n",
" 1314361881 | \n",
"
\n",
" \n",
" 2 | \n",
" BelgiumIndiaBrazil | \n",
" BrusselsNew DelhiBrasília | \n",
" 1522209409 | \n",
"
\n",
" \n",
"
\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",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 3.000000e+00 | \n",
"
\n",
" \n",
" mean | \n",
" 5.074031e+08 | \n",
"
\n",
" \n",
" std | \n",
" 6.961346e+08 | \n",
"
\n",
" \n",
" min | \n",
" 1.119085e+07 | \n",
"
\n",
" \n",
" 25% | \n",
" 1.095192e+08 | \n",
"
\n",
" \n",
" 50% | \n",
" 2.078475e+08 | \n",
"
\n",
" \n",
" 75% | \n",
" 7.555093e+08 | \n",
"
\n",
" \n",
" max | \n",
" 1.303171e+09 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" BelgiumBelgium | \n",
" BrusselsBrussels | \n",
" 22381692 | \n",
"
\n",
" \n",
" 1 | \n",
" IndiaIndia | \n",
" New DelhiNew Delhi | \n",
" 2606342070 | \n",
"
\n",
" \n",
" 2 | \n",
" BrazilBrazil | \n",
" BrasíliaBrasília | \n",
" 415695056 | \n",
"
\n",
" \n",
"
\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",
" Country | \n",
" Capital | \n",
" Population | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" BelgiumBelgium | \n",
" BrusselsBrussels | \n",
" 22381692 | \n",
"
\n",
" \n",
" 1 | \n",
" IndiaIndia | \n",
" New DelhiNew Delhi | \n",
" 2606342070 | \n",
"
\n",
" \n",
" 2 | \n",
" BrazilBrazil | \n",
" BrasíliaBrasília | \n",
" 415695056 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" NaN | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" NaN | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" NaN | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" NaN | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.2 | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 3 | \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 4 | \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" variable | \n",
" Observations | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2021-12-25 | \n",
" Type | \n",
" a | \n",
"
\n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" Type | \n",
" b | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" Type | \n",
" c | \n",
"
\n",
" \n",
" 3 | \n",
" 2021-12-27 | \n",
" Type | \n",
" a | \n",
"
\n",
" \n",
" 4 | \n",
" 2021-12-26 | \n",
" Type | \n",
" a | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" Type | \n",
" c | \n",
"
\n",
" \n",
" 6 | \n",
" 2021-12-25 | \n",
" Value | \n",
" 1.34 | \n",
"
\n",
" \n",
" 7 | \n",
" 2021-12-26 | \n",
" Value | \n",
" 10.2 | \n",
"
\n",
" \n",
" 8 | \n",
" 2021-12-25 | \n",
" Value | \n",
" 20.43 | \n",
"
\n",
" \n",
" 9 | \n",
" 2021-12-27 | \n",
" Value | \n",
" 50.31 | \n",
"
\n",
" \n",
" 10 | \n",
" 2021-12-26 | \n",
" Value | \n",
" 0.26 | \n",
"
\n",
" \n",
" 11 | \n",
" 2021-12-27 | \n",
" Value | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" NaN | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" NaN | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
"
\n",
" \n",
" Date | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" NaN | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 10.2 | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" NaN | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" NaN | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 3 | \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" index | \n",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0 | \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" 1 | \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2 | \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 3 | \n",
" 3 | \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 4 | \n",
" 4 | \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 5 | \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Time | \n",
" Category | \n",
" Number | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 3 | \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 4 | \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Value | \n",
"
\n",
" \n",
" Date | \n",
" Type | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 4 | \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Value | \n",
"
\n",
" \n",
" Date | \n",
" Type | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" 0.0 | \n",
" 20.43 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
" 0.00 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" 0.0 | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 2.68 | \n",
" NaN | \n",
" 20.86 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.52 | \n",
" 10.4 | \n",
" NaN | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.62 | \n",
" NaN | \n",
" 21.28 | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2021-12-25 | \n",
" a | \n",
" 1.34 | \n",
"
\n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 3 | \n",
" 2021-12-27 | \n",
" a | \n",
" 50.31 | \n",
"
\n",
" \n",
" 4 | \n",
" 2021-12-26 | \n",
" a | \n",
" 0.26 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" Type | \n",
" a | \n",
" b | \n",
" c | \n",
"
\n",
" \n",
" Date | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2021-12-25 | \n",
" 1.34 | \n",
" 10.2 | \n",
" 20.430 | \n",
"
\n",
" \n",
" 2021-12-26 | \n",
" 0.26 | \n",
" 10.2 | \n",
" 20.535 | \n",
"
\n",
" \n",
" 2021-12-27 | \n",
" 50.31 | \n",
" 10.2 | \n",
" 20.640 | \n",
"
\n",
" \n",
"
\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",
" Date | \n",
" Type | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2021-12-25 | \n",
" f | \n",
" 1.34 | \n",
"
\n",
" \n",
" 1 | \n",
" 2021-12-26 | \n",
" b | \n",
" 10.20 | \n",
"
\n",
" \n",
" 2 | \n",
" 2021-12-25 | \n",
" c | \n",
" 20.43 | \n",
"
\n",
" \n",
" 3 | \n",
" 2021-12-27 | \n",
" f | \n",
" 50.31 | \n",
"
\n",
" \n",
" 4 | \n",
" 2021-12-26 | \n",
" f | \n",
" 0.26 | \n",
"
\n",
" \n",
" 5 | \n",
" 2021-12-27 | \n",
" c | \n",
" 20.64 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" A | \n",
" B | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
"
\n",
" \n",
" 2 | \n",
" K2 | \n",
" A2 | \n",
" B2 | \n",
"
\n",
" \n",
" 3 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
" 3 | \n",
" K4 | \n",
" C3 | \n",
" D3 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K2 | \n",
" A2 | \n",
" B2 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
" 3 | \n",
" K4 | \n",
" NaN | \n",
" NaN | \n",
" C3 | \n",
" D3 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K2 | \n",
" A2 | \n",
" B2 | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
" 4 | \n",
" K4 | \n",
" NaN | \n",
" NaN | \n",
" C3 | \n",
" D3 | \n",
"
\n",
" \n",
"
\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",
" key_1 | \n",
" A | \n",
" B | \n",
" key_2 | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
" K0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
" K1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K2 | \n",
" A2 | \n",
" B2 | \n",
" K3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
" 3 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
" K4 | \n",
" C3 | \n",
" D3 | \n",
"
\n",
" \n",
"
\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",
" One | \n",
" Two | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 0.0 | \n",
" 3.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 1.0 | \n",
" -5.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 2.0 | \n",
" 7.0 | \n",
"
\n",
" \n",
" 4 | \n",
" 3.0 | \n",
" 4.0 | \n",
"
\n",
" \n",
" 5 | \n",
" 4.0 | \n",
" NaN | \n",
"
\n",
" \n",
" 6 | \n",
" 5.0 | \n",
" NaN | \n",
"
\n",
" \n",
" 0 | \n",
" NaN | \n",
" -1.0 | \n",
"
\n",
" \n",
"
\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",
" key | \n",
" A | \n",
" B | \n",
" key | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" K0 | \n",
" A0 | \n",
" B0 | \n",
" K0 | \n",
" C0 | \n",
" D0 | \n",
"
\n",
" \n",
" 1 | \n",
" K1 | \n",
" A1 | \n",
" B1 | \n",
" K1 | \n",
" C1 | \n",
" D1 | \n",
"
\n",
" \n",
" 2 | \n",
" K2 | \n",
" A2 | \n",
" B2 | \n",
" K3 | \n",
" C2 | \n",
" D2 | \n",
"
\n",
" \n",
" 3 | \n",
" K3 | \n",
" A3 | \n",
" B3 | \n",
" K4 | \n",
" C3 | \n",
" D3 | \n",
"
\n",
" \n",
"
\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
}