Pandas 极简入门:像操作 Excel 一样处理数据
一、Pandas 是干什么的?
一句话:Pandas 就是 Python 里的 Excel,专门用来处理表格数据。
它有三个核心"零件":
| 零件 | 是什么 | 比喻 |
|---|---|---|
| Series | 带标签的一列数据 | Excel 里单独一列,每行有名字 |
| DataFrame | 带标签的二维表格 | Excel 里的一张完整工作表 |
| 时间序列 | 以日期时间为索引的 Series | 按时间排列的一列数据 |
二、Series:一列带名字的数据
创建:
python
import pandas as pd
# 自动编号
s1 = pd.Series([1, 6, 11, 16])
# 用字典创建,字典的键自动变成行标签
s2 = pd.Series({'语文': 90, '数学': 92, 'Python': 98})
常用操作(和 NumPy 一样,都是批量操作):
python
s2['语文'] = 94 # 修改某个值
s2[s2 > 90] # 筛选大于90的科目
s2.mean() # 平均值
s2.median() # 中值
s2.nsmallest(2) # 最小的2个值
abs(s1) # 所有元素求绝对值
s1 + 5 # 所有元素加5
三、时间序列:自动生成日期
python
# 从某天开始,每隔7天生成一个日期
pd.date_range(start='20260101', periods=10, freq='7D')
# 常用频率:D=天,W=周,H=小时,M=月末,MS=月初
用日期做索引:
python
# 创建按小时排列的数据
data = pd.Series(index=pd.date_range(start='20260701', periods=24, freq='H'), data=range(24))
# 每3小时重采样,求平均值
data.resample('3H').mean()
四、DataFrame:一张完整的表格
创建表格(最常用字典方式):
python
# 字典的键变成列名,值变成数据
df = pd.DataFrame({
'语文': [87, 79, 67, 92],
'数学': [93, 89, 80, 77],
'英语': [90, 80, 70, 75]
}, index=['张三', '李四', '王五', '赵六'])
读取 Excel:
python
df = pd.read_excel('文件路径.xlsx')
df = pd.read_excel('文件路径.xlsx', usecols=['姓名', '交易额']) # 只读指定列
df = pd.read_excel('文件路径.xlsx', skiprows=[1,3,5]) # 跳过某些行
五、数据筛选和查看
三种取数据的方式:
| 方式 | 怎么用 | 什么时候用 |
|---|---|---|
df[条件] |
df[df['交易额'] > 2000] |
按条件筛选行 |
df.iloc[行号, 列号] |
df.iloc[3, 1] |
按数字位置取 |
df.loc[行标签, 列名] |
df.loc['张三', '交易额'] |
按名字取 |
查看数据概览:
python
df.head() # 前5行
df.tail() # 后5行
df['交易额'].describe() # 一键看所有统计信息(总数、均值、最大最小等)
df['交易额'].max() # 最大值
df['交易额'].min() # 最小值
df['交易额'].idxmax() # 最大值在哪一行
df.nlargest(5, '交易额') # 交易额最大的5条
df.nsmallest(3, '交易额') # 交易额最小的3条
六、排序
python
# 按一列排序
df.sort_values(by='交易额', ascending=False) # 降序
# 按多列排序(先按交易额降序,再按工号升序)
df.sort_values(by=['交易额', '工号'], ascending=[False, True])
# 按列名排序
df.sort_index(axis=1)
七、分组聚合(像 Excel 的分类汇总)
三步套路 :分组 → 取列 → 计算
python
# 每个员工卖了多少钱?
df.groupby(by='姓名')['交易额'].sum()
# 每个柜台的交易额平均值?
df.groupby(by='柜台')['交易额'].mean()
# 每个员工在不同时段的交易额?
df.groupby(by=['姓名', '时段'])['交易额'].sum()
# 一键做多种计算
df.groupby(by='姓名').agg(['sum', 'mean', 'min', 'max'])
八、数据清洗
异常值:
python
# 找出异常值
df[df['交易额'] < 200] # 低于200的
df[df['交易额'] > 3000] # 高于3000的
# 替换异常值
df.loc[df['交易额'] < 200, '交易额'] = 200 # 低于200的全部改成200
缺失值:
python
df.dropna() # 直接丢掉有空值的行
df.fillna({'交易额': 1000}) # 用固定值填充
df.fillna(df['交易额'].mean()) # 用平均值填充
重复值:
python
df.duplicated() # 查哪些行重复了
df.drop_duplicates() # 删掉重复行
df.drop_duplicates(subset=['工号', '日期']) # 指定列去重
九、透视表和交叉表
透视表:把数据按行列重新排列,自动汇总。
python
# 每人每天的交易额总额
df.pivot_table(values='交易额', index='姓名', columns='日期', aggfunc='sum', margins=True)
交叉表:专门统计频次的透视表。
python
# 每人每天的上班次数
pd.crosstab(df['姓名'], df['日期'], margins=True)
# 每人在各柜台交易总额
pd.crosstab(df['姓名'], df['柜台'], df['交易额'], aggfunc='sum')
pivot_table 和 crosstab 的区别:
| 用哪个 | 什么时候用 |
|---|---|
pivot_table |
已经有效据,想按不同维度汇总(求和、平均等) |
crosstab |
想统计出现了多少次(频次),两个都可以用 |
十、标准差和协方差
标准差:看数据稳不稳定。越小越稳定,越大越像过山车。
python
df.std() # 标准差
df.std()**2 # 方差(标准差的平方)
协方差:看两组数据是同步变化还是反向变化。
python
df.cov() # 协方差矩阵
| 协方差值 | 含义 | 比喻 |
|---|---|---|
| 正数 | 同步变化 | 你往前走,我也往前走 |
| 负数 | 反向变化 | 你往前走,我往后退 |
| 接近0 | 互不影响 | 各走各的 |
十一、数据合并
python
# 按行堆叠(加长)
pd.concat([表1, 表2, 表3])
# 按列关联(加宽),像 Excel 的 VLOOKUP
pd.merge(员工表, 工资表, on='工号')
十二、两个好用的内置接口
dt 接口:处理日期。
python
pd.to_datetime(df['日期']).dt.weekday_name # 自动转成周几
pd.to_datetime(df['日期']).dt.quarter # 自动转成第几季度
str 接口:处理字符串。
python
df['日期'].str.extract(r'(\d{4}-\d{2})') # 提取年月
df['日期'].str.endswith('6') # 判断是否以6结尾
Pandas 最核心的思维模式
| 你想做什么 | 对应的操作 |
|---|---|
| 看数据长什么样 | head()、describe() |
| 找符合条件的数据 | df[df['列名'] > 值] |
| 按某列分类汇总 | df.groupby('列名')['要算的列'].sum() |
| 把表排个序 | df.sort_values(by='列名') |
| 把两张表拼一起 | pd.concat() 或 pd.merge() |
| 把汇总结果做成二维表 | df.pivot_table() |
| 处理脏数据 | dropna()、fillna()、drop_duplicates() |
附:Pandas 核心函数速查表
| 函数 | 一句话用途 |
|---|---|
pd.read_excel() |
读取 Excel 文件 |
df.head() / df.tail() |
看前/后几行 |
df.describe() |
一键看所有统计信息 |
df['列名'].max() / .min() / .mean() / .sum() |
最大/最小/平均/求和 |
df[df['列名'] > 值] |
按条件筛选 |
df.sort_values(by='列名') |
按某列排序 |
df.groupby('列名')['算的列'].sum() |
分类汇总求和 |
df.groupby('列名').agg(['sum','mean']) |
同时做多种汇总 |
df.pivot_table(values, index, columns, aggfunc) |
透视表 |
pd.crosstab(index, columns, values, aggfunc) |
交叉表(统计频次) |
df.dropna() / df.fillna() |
处理缺失值 |
df.drop_duplicates() |
去重 |
df.resample('7D', on='日期').sum() |
重采样(按时间汇总) |
df.std() / df.cov() |
标准差 / 协方差 |
pd.concat([表1, 表2]) |
按行堆叠 |
pd.merge(表1, 表2, on='键') |
按列关联 |
注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。