自学教程 学编程从这里开始

Pandas 常用函数

本文整理 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, "大单", "小单")

十八、避坑小结

  1. & | ~ 配合布尔筛选,每个条件要加括号;不要直接用 and / or
  2. map 只适合Series;apply 灵活但是速度慢
  3. str.xxx 遇到NaN会返回NaN,搭配 na=False
  4. inplace=True 不推荐,优先接收返回新df
  5. 日期务必用 pd.to_datetime,不要字符串比较
标签:

0 条笔记