本文整理 Pandas 日常开发、数据分析、清洗、统计高频函数,按功能分类,附简短示例,适合快速查阅,承接前面销售明细数据集。
前置导入:
import pandas as pd
import numpy as np
示例基础数据:
data = {
"订单号": ["A001", "A002", "A003", "A004", "A005"],
"商品": ["键盘", "鼠标", "显示器", "键盘", "鼠标"],
"数量": [2, 1, 1, 3, 2],
"单价": [89, 45, 1200, 89, 45],
"下单日期": ["2026-10-01", "2026-10-02", "2026-10-03", "2026-10-04", "2026-10-05"]
}
df = pd.DataFrame(data)
一、创建与读取写入
# 从字典创建DataFrame
df = pd.DataFrame(data)
# 从列表创建
df = pd.DataFrame([[1,2],[3,4]], columns=["a","b"])
# 读取文件
pd.read_excel("data.xlsx", sheet_name="销售明细")
pd.read_csv("data.csv", encoding="utf-8")
pd.read_parquet("data.parquet")
pd.read_sql(sql, conn)
# 写出文件
df.to_excel("out.xlsx", index=False)
df.to_csv("out.csv", index=False)
df.to_parquet("out.parquet")
二、查看信息、探查数据
df.head(3) # 前N行,默认5
df.tail(3) # 后N行
df.sample(2) # 随机抽样
df.info() # 列类型、非空数量
df.describe() # 数值列统计:均值、标准差、四分位数
df.shape # (行数,列数)
df.columns # 列名列表
df.dtypes # 每列数据类型
df.index # 索引
df.value_counts() # 分组计数(非常常用)
df["商品"].value_counts()
df.unique() # 唯一值数组
df.nunique() # 唯一值数量
三、索引、筛选、切片
# 取单列
df["商品"]
df.商品
# 多列
df[["订单号","商品","数量"]]
# 行筛选(布尔条件)
df[df["数量"] > 1]
df[(df["数量"]>1) & (df["单价"]<100)] # 与
df[(df["单价"]<50) | (df["单价"]>1000)] # 或
df[df["商品"].isin(["键盘","鼠标"])] # 在列表内
df[~df["商品"].isin(["显示器"])] # 取反
# loc 标签索引:行标签 + 列名
df.loc[0, "商品"]
df.loc[df["数量"]>1, ["订单号","单价"]]
# iloc 位置索引:数字下标
df.iloc[0] # 第0行
df.iloc[:, 0:3] # 所有行,0~2列
四、新增、修改、删除列
# 新增计算列
df["金额"] = df["数量"] * df["单价"]
# 删除列
df.drop(columns=["金额"], inplace=False)
# 删除行
df.drop(index=0)
# 重命名列
df.rename(columns={"下单日期":"order_date"})
五、缺失、重复相关函数
df.isna() # 判断是否缺失
df.isnull() # 等价isna()
df.notna()
df.dropna(how="any") # 删除缺失行
df.fillna(0) # 填充缺失
df["col"].ffill() # 前向填充
df["col"].bfill() # 后向填充
df.duplicated() # 判断是否重复行
df.drop_duplicates(subset=["商品"], keep="first")
六、排序、排名
# 按单价升序,数量降序
df.sort_values(by=["单价","数量"], ascending=[True, False])
# 索引排序
df.sort_index()
# 排名
df["rank"] = df["单价"].rank(method="min")
七、分组聚合 groupby
g = df.groupby("商品")
g["数量"].sum()
g.agg(
总数量=("数量", "sum"),
平均单价=("单价", "mean")
)
# 多聚合
g["单价"].agg(["mean","max","min","count"])
八、表合并 merge / concat / join
# 内连接,类似SQL inner join
pd.merge(df1, df2, on="订单号", how="inner")
# 纵向拼接
pd.concat([df1, df2], axis=0)
# 横向拼接
pd.concat([df1, df2], axis=1)
九、字符串 Series.str 系列(高频)
df["商品"].str.strip() # 去除首尾空格
df["商品"].str.upper() # 大写
df["商品"].str.lower() # 小写
df["商品"].str.contains("键", na=False) # 是否包含
df["商品"].str.replace("键盘","机械键盘", regex=False)
df["订单号"].str.extract(r"A(\d+)") # 正则提取
十、时间 dt 系列
df["下单日期"] = pd.to_datetime(df["下单日期"])
df["下单日期"].dt.year
df["下单日期"].dt.month
df["下单日期"].dt.day
df["下单日期"].dt.weekday
df["下单日期"].dt.is_month_start
十一、映射替换 apply / map / applymap
# map:Series一对一映射
price_map = {89:"平价", 45:"低价", 1200:"高价"}
df["价格等级"] = df["单价"].map(price_map)
# apply:Series自定义函数
df["金额等级"] = df["金额"].apply(lambda x: "贵" if x>500 else "便宜")
# apply 作用于整行(axis=1)
df["备注"] = df.apply(lambda row: f"{row['商品']}-{row['数量']}", axis=1)
注意:大数据优先向量化,少用apply。
十二、透视、交叉表
# 透视表
pd.pivot_table(df, index="商品", values="数量", aggfunc="sum")
# 交叉统计表
pd.crosstab(df["商品"], df["下单日期"].dt.month)
十三、数学统计函数(作用于Series)
df["数量"].sum() # 求和
df["数量"].mean() # 均值
df["数量"].max() # 最大值
df["数量"].min() # 最小值
df["数量"].count() # 非空计数
df["数量"].median() # 中位数
df["数量"].std() # 标准差
df["数量"].var() # 方差
df["数量"].quantile(0.75) # 分位数
十四、去重、转换、类型
df["商品"].unique()
df["商品"].nunique()
df["数量"].astype("int32")
pd.to_numeric(df["col"], errors="coerce")
pd.to_datetime(df["col"], errors="coerce")
十五、管道 pipe(链式处理)
def add_total(df):
df["金额"] = df["数量"] * df["单价"]
return df
df_clean = df.pipe(add_total)
十六、常用函数速查表
| 函数 | 作用 |
|---|---|
loc | 标签筛选 |
iloc | 位置下标筛选 |
query | 字符串表达式筛选 df.query("数量>1") |
where | 条件保留,不符合置NaN |
mask | 条件为True置NaN |
shift | 上下偏移(时序差分) |
diff | 差分 |
cumsum | 累加和 |
cut | 分箱(固定区间) |
qcut | 分箱(等数量分箱) |
十七、补充小技巧
# query 简洁筛选
df.query("数量 > 1 and 单价 < 100")
# 差分、累计
df["累计销量"] = df["数量"].cumsum()
df["上期数量"] = df["数量"].shift(1)
df["增量"] = df["数量"].diff()
# 条件赋值 np.where
df["标签"] = np.where(df["金额"]>500, "大单", "小单")
十八、避坑小结
& | ~配合布尔筛选,每个条件要加括号;不要直接用 and / ormap只适合Series;apply灵活但是速度慢str.xxx遇到NaN会返回NaN,搭配na=Falseinplace=True不推荐,优先接收返回新df- 日期务必用
pd.to_datetime,不要字符串比较
0 条笔记