Pandas中Series与DataFrame常用属性包括形状、大小、数值、索引、列名;常用方法有头部、尾部、唯一值、值计数、填充缺失值、删除缺失值、排序、分组、合并;数据更改通过索引赋值、添加删除行列实现;导入导出支持CSV、Excel、JSON等格式,是数据分析常用操作。
先从pandas最基础的Series说起,它是数据分析的基石,很多操作思路和DataFrame是相通的。掌握Series的常用属性和方法,是学习pandas的第一步。
以下是pandas Series中你平时一定会用到的属性,建议先熟悉它们:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
| loc | 根据行索引获取某行数据,属于DataFrame对象的方法 |
| iloc | 根据行号获取某行数据,同样属于DataFrame对象 |
| dtype | 返回Series的元素类型 |
| T | 转置 |
| shape | 返回Series的维度(即行数,因为是一维) |
| size | 返回元素个数 |
| values | 返回底层数值数组 |
| index | 返回索引对象,功能类似keys() |
| name | 返回Series的名称 |
pandas创建Series有多种方式,最常用的就是下面这几种:
arr = np.array([1,2,3,4,5]) s1 = pd.Series(arr)
s = pd.Series([1,2,3,4,5])
s3 = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])
s4 = pd.Series((1,3,5),index=['a','b','c'])
s5 = pd.Series({'a':1,'b':2,'c':3})
这些pandas Series方法几乎天天打交道,特别是head()/tail()和value_counts():
| head(n)/tail(n) | 获取前 n 行 / 后 n 行数据(默认 5 行) |
| unique() | 返回唯一值数组 |
| nunique() | 返回唯一值的数量 |
| value_counts() | 计算值的出现频率 |
| isnull()/notnull() | 检测缺失值 |
| fillna(value) | 填充缺失值 |
| dropna() | 删除缺失值 |
| astype(dtype) | 转换数据类型 |
| apply(func) | 对每个元素应用函数 |
| sort_values()/sort_index() | 按值 / 索引排序 |
DataFrame是pandas的"正主",表格数据基本都靠它处理。下面列出pandas DataFrame最常用的属性和方法:
| values | 返回底层二维数组(NumPy数组) |
| columns | 返回列标签 |
| index | 返回行索引 |
| dtypes | 返回各列的数据类型 |
| shape | 返回形状(行数,列数) |
| size | 返回元素总数(行数 × 列数) |
| T | 返回转置后的DataFrame |
| head(n)/tail(n) | 查看前 n 行 / 后 n 行 |
| info() | 查看基本信息(非空值数量、数据类型等) |
| describe() | 生成描述性统计(计数、均值、标准差等) |
| drop(columns,axis = 1) | 删除指定列 |
| drop(index,axis = 0) | 删除指定行 |
| fillna(value) | 填充缺失值 |
| dropna() | 删除缺失值 |
| groupby(by) | 按指定列分组 |
| merge(other) | 与另一个DataFrame合并 |
| pivot_table() | 创建透视表 |
| sort_values(by) | 按指定列排序 |
| sort_index() | 按索引排序 |
| apply(func,axis) | 沿指定轴应用函数 |
| applymap(func) | 对每个元素应用函数(已过时,推荐用map或apply) |
| corr() | 计算列间相关系数 |
数据不是一成不变的,学会用pandas增删改是基本功。下面分两部分说明。
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') # 删除指定索引的元素
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的导入导出支持非常全面。
df = pd.read_csv('file.csv') # 基本用法
df = pd.read_csv('file.csv', sep=';', header=0, index_col=0) # 自定义分隔符、表头、索引列
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)
df = pd.read_json('file.json')
df.to_csv('output.csv', index=False) # index=False不导出索引
df.to_excel('output.xlsx', sheet_name='Data', index=False)
df.to_json('output.json', orient='records')
df.to_sql('table_name', conn, if_exists='replace', index=False)
最后再补充几个pandas实战中经常遇到的细节问题。
1.inplace参数:pandas很多修改方法(如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.大型数据集处理:pandas读取大文件时用chunksize分块,避免内存爆炸:
for chunk in pd.read_csv('large_file.csv', chunksize=1000):
process(chunk)
5.缺失值处理:pandas中除了fillna()和dropna(),interpolate()插值法在时间序列数据中特别好用。
6.迭代效率:pandas中尽量避免用for循环遍历DataFrame,优先用apply()、map()等向量化操作,实在需要逐行遍历时,用itertuples()会比iterrows()快不少。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述