一、Series——pandas 核心数据结构
先从 pandas 中最基础的 Series 说起,它是整个库的基石,很多操作思路与 DataFrame 是相通的,掌握 Series 对后续学习至关重要。
1. 常用属性
下面列出几个你日常一定会用到的属性,建议先熟悉它们:
| loc | 根据行索引标签获取指定行数据,属于 DataFrame 对象的索引方法 |
| iloc | 根据行位置(整数序号)获取某行数据,同样属于 DataFrame 对象 |
| dtype | 返回 Series 中元素的数据类型(如 int64、float64 等) |
| T | 返回转置结果(对一维 Series 效果有限,但 DataFrame 中常用) |
| shape | 返回 Series 的维度信息,即行数(因为是一维结构) |
| size | 返回 Series 中元素的总个数 |
| values | 以 NumPy 数组形式返回底层数值 |
| index | 返回索引对象,功能类似于字典的 keys() 方法 |
| name | 返回 Series 的名称属性(创建时指定) |
2. 创建方式
创建 Series 有多种常用方法,最常用的包括以下几种:
1. 通过 NumPy 数组创建
arr = np.array([1,2,3,4,5]) s1 = pd.Series(arr)
2. 直接传入列表
s = pd.Series([1,2,3,4,5])
3. 指定自定义索引
s3 = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])
4. 通过元组传入
s4 = pd.Series((1,3,5),index=['a','b','c'])
5. 通过字典传入
s5 = pd.Series({'a':1,'b':2,'c':3})
3. 常用方法
这些方法几乎每天都会用到,特别是 head() / tail() 和 value_counts():
| head(n) / tail(n) | 获取前 n 行 / 后 n 行数据(默认 5 行) |
| unique() | 返回去重后的唯一值数组 |
| nunique() | 返回唯一值的数量 |
| value_counts() | 计算每个值的出现频率 |
| isnull() / notnull() | 检测缺失值(返回布尔 Series) |
| fillna(value) | 用指定值填充缺失值 |
| dropna() | 删除含有缺失值的元素 |
| astype(dtype) | 转换 Series 的数据类型 |
| apply(func) | 对每个元素依次应用自定义函数 |
| sort_values() / sort_index() | 按值或索引进行排序 |
二、DataFrame——表格数据处理核心
DataFrame 是 pandas 的“主将”,表格数据基本都靠它操作。下面列出最常用的属性和方法:
1. 常用属性
| values | 返回底层二维数组(NumPy 数组) |
| columns | 返回列标签(列名) |
| index | 返回行索引 |
| dtypes | 返回各列的数据类型 |
| shape | 返回形状(行数,列数) |
| size | 返回元素总数(行数 × 列数) |
| T | 返回转置后的 DataFrame |
2. 常用方法
| head(n) / tail(n) | 查看前 n 行 / 后 n 行数据 |
| info() | 查看基本信息(非空值数量、数据类型等) |
| describe() | 生成描述性统计(计数、均值、标准差等) |
| drop(columns, axis=1) | 删除指定列 |
| drop(index, axis=0) | 删除指定行 |
| fillna(value) | 填充缺失值 |
| dropna() | 删除含有缺失值的行或列 |
| groupby(by) | 按指定列分组 |
| merge(other) | 与另一个 DataFrame 合并(类似 SQL 的 JOIN) |
| pivot_table() | 创建透视表 |
| sort_values(by) | 按指定列排序 |
| sort_index() | 按索引排序 |
| apply(func, axis) | 沿指定轴应用函数 |
| applymap(func) | 对每个元素应用函数(已过时,推荐改用 map 或 apply) |
| corr() | 计算列与列之间的相关系数 |
三、修改 Series 和 DataFrame 的方法
数据不是一成不变的,学会增删改是基本功。下面分两部分讲解。
1. 修改 Series
根据索引直接赋值
s = pd.Series([1,2,3], index=['a','b','c']) s['b'] = 10 # 修改单个值 s[['a','c']] = [20, 30] # 修改多个值
添加元素
s['d'] = 40 # 添加单个元素 s = s.append(pd.Series([50], index=['e'])) # 添加多个元素(注意:append 在新版本中已过时)
删除元素
s = s.drop('e') # 删除指定索引的元素
2. 修改 DataFrame
添加列
s = s.drop('e') # 删除指定索引的元素
修改列名
df.rename(columns={'old_name': 'new_name'}, inplace=True)
df.columns = ['col1', 'col2', 'col3'] # 批量修改
修改值
df.loc[0, 'col1'] = 100 # 通过标签修改 df.iloc[1, 2] = 200 # 通过位置修改
添加行
new_row = pd.DataFrame([[1,2,3]], columns=df.columns) df = pd.concat([df, new_row], ignore_index=True) # 使用 concat 添加行
删除行列
df.drop(columns=['col1'], inplace=True) # 删除列 df.drop(index=[0,1], inplace=True) # 删除行
四、数据导入与导出
与外部文件打交道是日常工作中最常见的场景,pandas 为数据读写提供了非常全面的支持。
1. 导入数据
从 CSV 文件导入
df = pd.read_csv('file.csv') # 基本用法
df = pd.read_csv('file.csv', sep=';', header=0, index_col=0) # 自定义分隔符、表头、索引列
从 Excel 文件导入
df = pd.read_excel('file.xlsx') # 读取第一个工作表
df = pd.read_excel('file.xlsx', sheet_name='Sheet2') # 指定工作表
从数据库导入
import sqlite3
conn = sqlite3.connect('database.db')
df = pd.read_sql_query('SELECT * FROM table', conn)
从 JSON 导入
df = pd.read_json('file.json')
2. 导出数据
导出为 CSV
df.to_csv('output.csv', index=False) # index=False 表示不导出索引
导出为 Excel
df.to_excel('output.xlsx', sheet_name='Data', index=False)
导出为 JSON
df.to_json('output.json', orient='records')
导出到数据库
df.to_sql('table_name', conn, if_exists='replace', index=False)
五、实用扩展技巧
最后补充几个实战中经常遇到的细节,帮助你更高效地使用 pandas。
1. inplace 参数:很多修改方法(如 drop()、fillna())都包含这个参数,设为 True 时直接修改原对象,不返回新对象;默认 False,返回修改后的副本。建议新手先用默认值,避免不小心误改原始数据。

2. 链式操作:pandas 支持链式调用,写起来非常简洁:
df = pd.read_csv('data.csv').dropna().rename(columns=str.lower).sort_values('date')
3. 数据类型转换:使用 astype() 时要注意兼容性,例如字符串不能直接转为整数。可以先尝试 pd.to_numeric():
df['col'] = pd.to_numeric(df['col'], errors='coerce') # 无法转换的值变为 NaN
4. 大型数据集处理:读取大文件时使用 chunksize 分块读取,避免内存溢出:
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
process(chunk)
5. 缺失值处理:除了 fillna() 和 dropna(),interpolate() 插值法在时间序列数据中特别实用。
6. 迭代效率:尽量避免用 for 循环遍历 DataFrame,优先使用 apply()、map() 等向量化操作;如果必须逐行遍历,用 itertuples() 会比 iterrows() 快很多。
