Pandas速查手册
1. 数据创建与读取 (Data I/O)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
pd.DataFrame() |
创建二维数据框表格 | data, index, columns, dtype |
df = pd.DataFrame({'A': [1, 2], 'B': ['x', 'y']}) |
pd.Series() |
创建一维带标签数组 | data, index, name, dtype |
s = pd.Series([10, 20, 30], name='score') |
pd.read_csv() |
读取 CSV / 文本文件 | filepath, sep, encoding, usecols, parse_dates |
df = pd.read_csv('data.csv', encoding='utf-8', usecols=['id', 'age']) |
pd.read_excel() |
读取 Excel 工作簿 | io, sheet_name, header, usecols, skiprows |
df = pd.read_excel('sales.xlsx', sheet_name='2023_Q1') |
pd.read_sql() |
通过 SQL 查询读取数据库数据 | sql, con, index_col, params |
df = pd.read_sql("SELECT * FROM users WHERE age > 18", conn) |
pd.read_json() |
读取 JSON 格式字符串/文件 | path_or_buf, orient, lines |
df = pd.read_json('data.json', orient='records') |
2. 数据探索与概览 (Exploration & Inspection)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
df.head() / df.tail() |
查看前 N 行 / 后 N 行数据 | n (默认 5) |
df.head(10) df.tail(3) |
df.info() |
打印数据框内存、类型及非空值统计 | verbose, memory_usage |
df.info() |
df.describe() |
计算数值列描述性统计指标(均值、分位数等) | percentiles, include, exclude |
df.describe(include='all') |
df.shape / df.dtypes |
查看数据框行列维度 / 各列数据类型 | 属性(无参数) | rows, cols = df.shape print(df.dtypes) |
s.value_counts() |
统计序列中各唯一值出现的频次与占比 | normalize=True/False, dropna=False, bins |
df['category'].value_counts(normalize=True) |
s.unique() / s.nunique() |
获取唯一值数组 / 唯一值数量计数 | dropna=True |
unique_cities = df['city'].unique() num = df['city'].nunique() |
3. 数据选择与筛选 (Indexing & Filtering)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
df['col'] / df[['A','B']] |
选择单列(返回 Series)或多列(DataFrame) | 列名或列名列表 | sub_df = df[['name', 'age', 'gender']] |
df.loc[] |
根据标签名称进行行列切片与选择 | [行标签/条件, 列标签] |
df.loc[df['age'] > 20, ['name', 'salary']] |
df.iloc[] |
根据整数位置索引进行切片与选择 | [行索引位置, 列索引位置] |
df.iloc[0:10, 0:3] |
布尔逻辑筛选 |
使用逻辑运算符进行多条件组合筛选 | & (与), | (或), ~ (非) |
df[(df['age'] >= 18) & (df['status'] == 'Active')] |
df.query() |
使用字符串表达式进行高效条件查询 | expr, inplace=False |
df.query('age > 18 and city in ["BJ", "SH"]') |
s.isin() |
筛选列值在指定列表/集合中的行 | values |
df[df['department'].isin(['IT', 'HR'])] |
s.str.contains() |
文本列正则/模糊子串匹配筛选 | pat, case=True, regex=True, na=False |
df[df['email'].str.contains('@gmail\.com$', na=False)] |
4. 数据清洗与处理 (Data Cleaning)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
df.isna() / df.notna() |
检测是否为缺失值/非缺失值(返回布尔矩阵) | 无 | null_counts = df.isna().sum() |
df.dropna() |
删除包含缺失值的行或列 | axis, how='any'/'all', subset, thresh |
df = df.dropna(subset=['user_id', 'email']) |
df.fillna() |
填充/替换数据中的缺失值 | value, method='ffill'/'bfill', axis |
df['score'] = df['score'].fillna(df['score'].median()) |
df.drop_duplicates() |
查找并删除重复数据行 | subset, keep='first'/'last'/False |
df = df.drop_duplicates(subset=['order_id'], keep='first') |
df.rename() |
重命名行索引或列名称 | mapper, columns, index, inplace |
df = df.rename(columns={'old_name': 'new_name'}) |
df.astype() |
显式转换序列或全表的数据类型 | dtype, copy, errors='raise'/'ignore' |
df['age'] = df['age'].astype('int64') |
df.replace() |
替换指定的值或正则表达式匹配项 | to_replace, value, regex |
df['gender'] = df['gender'].replace({'M': 'Male', 'F': 'Female'}) |
5. 数据转换与衍生列 (Transformation)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
df.apply() |
对数据框的行(axis=1)或列(axis=0)应用自定义函数 | func, axis, raw, result_type |
df['total'] = df.apply(lambda r: r['price'] * r['qty'], axis=1) |
s.map() |
根据字典、函数或映射关系转换 Series 值 | arg, na_action |
df['status_code'] = df['status'].map({'OK': 200, 'ERR': 500}) |
pd.cut() |
将连续数值变量按区间划分为离散分箱(Equal-width) | x, bins, labels, right, include_lowest |
df['age_group'] = pd.cut(df['age'], bins=[0, 18, 60, 100], labels=['Child', 'Adult', 'Senior']) |
pd.qcut() |
按分位数将连续变量划分为样本量等同的区间(Equal-frequency) | x, q, labels |
df['income_quartile'] = pd.qcut(df['income'], q=4, labels=['Q1', 'Q2', 'Q3', 'Q4']) |
df.sort_values() |
按照一列或多列的值进行排序 | by, ascending, na_position |
df = df.sort_values(by=['dept', 'salary'], ascending=[True, False]) |
pd.get_dummies() |
将分类变量转换为独热编码(One-Hot / Dummy 变量) | data, columns, prefix, drop_first |
df = pd.get_dummies(df, columns=['category'], drop_first=True) |
6. 分组聚合与数据透视 (GroupBy & Pivot)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
df.groupby() |
根据指定字段对数据进行拆分分组 | by, as_index=True/False, sort |
grouped = df.groupby('department') |
groupby().agg() |
对分组后的各字段应用一个或多个聚合操作 | func, *args, **kwargs |
df.groupby('dept').agg({'salary': ['mean', 'max'], 'age': 'median'}) |
groupby().transform() |
计算分组统计量并广播扩展返回与原表同等行数的结果 | func |
df['dept_avg_sal'] = df.groupby('dept')['salary'].transform('mean') |
pd.pivot_table() |
创建电子表格风格的数据透视表 | values, index, columns, aggfunc, fill_value, margins |
pd.pivot_table(df, values='sales', index='region', columns='year', aggfunc='sum', margins=True) |
pd.crosstab() |
计算两个或多个因子的频数交叉汇总表 | index, columns, values, aggfunc, normalize |
pd.crosstab(df['gender'], df['passed'], normalize='index') |
7. 数据合并与拼接 (Merge & Concatenate)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
pd.merge() |
类似 SQL 的主外键多表关联操作 | left, right, how='inner'/'left'/'right'/'outer', on, left_on, right_on |
df_all = pd.merge(df_orders, df_users, on='user_id', how='left') |
pd.concat() |
沿着纵轴(行)或横轴(列)物理堆叠拼接多个 DataFrame | objs, axis=0/1, join='outer'/'inner', ignore_index=True |
df_combined = pd.concat([df_2022, df_2023], axis=0, ignore_index=True) |
df.join() |
基于索引 (Index) 快速合并两个 DataFrame | other, on, how='left'/'outer', lsuffix, rsuffix |
df_joined = df1.join(df2, lsuffix='_left', rsuffix='_right') |
8. 时间序列处理 (Time Series / DateTime)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
pd.to_datetime() |
将文本或数字列转换为标准的 datetime64 类型 | arg, format, errors='coerce'/'raise' |
df['date'] = pd.to_datetime(df['date_str'], format='%Y-%m-%d') |
dt 属性访问器 |
提取日期的年、月、日、星期、季度等属性 | .dt.year / .dt.month / .dt.day / .dt.day_name() |
df['year'] = df['date'].dt.year df['weekday'] = df['date'].dt.day_name() |
pd.date_range() |
生成固定频率的连续时间索引/序列 | start, end, periods, freq='D'/'M'/'H'/'B' |
dates = pd.date_range(start='2023-01-01', periods=12, freq='MS') |
df.resample() |
时间序列重采样(如按月、按周重采样降采样或升采样) | rule (‘D’, ‘W’, ‘M’, ‘Q’), on |
df.set_index('date').resample('M')['sales'].sum() |
s.shift() |
将序列中的数据向上或向下偏移 N 个周期(常用于计算同比/环比) | periods, freq, fill_value |
df['prev_sales'] = df['sales'].shift(1) df['growth'] = df['sales'] - df['prev_sales'] |
s.rolling() |
创建滑动窗口以计算移动平均、滑动求和等指标 | window, min_periods, center |
df['ma_7'] = df['sales'].rolling(window=7).mean() |
9. 数据输出与导出 (Data Export)
| 函数 / 方法 | 功能说明 | 核心参数说明 | 代码示例 |
|---|---|---|---|
df.to_csv() |
导出数据至 CSV 格式文件 | path_or_buf, index=False, encoding='utf-8-sig' |
df.to_csv('result.csv', index=False, encoding='utf-8-sig') |
df.to_excel() |
导出数据至 Excel 工作薄 | excel_writer, sheet_name, index=False |
df.to_excel('result.xlsx', sheet_name='Summary', index=False) |
df.to_json() |
导出数据为 JSON 格式文件或字符串 | path_or_buf, orient='records'/'split'/'dict' |
df.to_json('result.json', orient='records', force_ascii=False) |
df.to_sql() |
将 DataFrame 直接写入数据库表中 | name, con, if_exists='fail'/'replace'/'append', index |
df.to_sql('target_table', con=engine, if_exists='append', index=False) |