Pandas 常用方法速查表:60 条 写在前面这篇不是教程是工具书。写脚本时最耗时的往往不是想逻辑而是「这个操作叫什么来着」删除列是drop还是del取前几行是head还是iloc[:5]重命名列是rename还是直接赋columns每次卡在这儿搜一次要两分钟。所以我把常见操作整理成 60 条按使用频率分类。建议收藏 用 CtrlF 搜方法名别从头读。先确认示例数据在手边importosimportmkdataifnotos.path.exists(data/sales.csv):mkdata.main()print(示例数据就绪,os.path.exists(data/sales.csv))这段会检查第 1 篇生成的data/目录在不在不在就自动补一次已经有数据时只会打印一行示例数据就绪 True不影响后面的结果。图 160 条方法按 8 类归位。查表时先定位类别再在类别里找方法比从头翻快得多。一、读取与写出8 条#做什么写法1读 CSVpd.read_csv(f.csv, encodingutf-8-sig)2只读部分列pd.read_csv(f.csv, usecols[城市, 金额])3指定类型pd.read_csv(f.csv, dtype{学号: str})4读 Excel 多 sheetpd.read_excel(f.xlsx, sheet_nameNone)5读 JSONpd.read_json(f.json)或linesTrue6读数据库pd.read_sql(SELECT ..., conn)7写 CSV防乱码df.to_csv(o.csv, indexFalse, encodingutf-8-sig)8写多 sheet Excelwith pd.ExcelWriter(o.xlsx) as w: df.to_excel(w, sheet_name明细, indexFalse)二、查看与探查8 条#做什么写法9前几行 / 后几行df.head(5)/df.tail(5)10形状df.shape11列名df.columns.tolist()12类型df.dtypes/df.info()13数值统计df.describe()14缺失统计df.isna().sum()15缺失率df.isna().mean().round(3)16重复行数df.duplicated().sum()三、选择与筛选10 条#做什么写法17取一列df[金额]18取多列df[[城市, 金额]]19按位置取行df.iloc[0:5]20按标签取行df.loc[0]21按条件筛行df[df[金额] 100]22多条件df[(df[城市] 杭州) (df[金额] 100)]23取反df[~(df[城市] 杭州)]24名单筛选df[df[城市].isin([北京, 广州])]25区间筛选df[df[数量].between(3, 5)]26字符串包含df[df[产品].str.contains(笔记本, naFalse)]四、清洗12 条#做什么写法27删缺失行df.dropna(subset[金额])28填固定值df[城市].fillna(未知)29填均值/中位数df[金额].fillna(df[金额].median())30分组填充df[金额].fillna(df.groupby(城市)[金额].transform(median))31前后向填充df[金额].ffill()/.bfill()32去重df.drop_duplicates()33按组合键去重df.drop_duplicates(subset[订单日期, 城市])34类型转换df[数量].astype(int8)35安全转数值pd.to_numeric(df[金额], errorscoerce)36转日期pd.to_datetime(df[订单日期], format%Y-%m-%d)37去首尾空格df.columns df.columns.str.strip()38重命名列df.rename(columns{金额: amount})五、变形10 条#做什么写法39排序df.sort_values(金额, ascendingFalse)40多列排序df.sort_values([城市, 金额], ascending[True, False])41重置索引df.reset_index(dropTrue)42设索引df.set_index([城市, 产品])43长表转宽表df.set_index([...])[金额].unstack(fill_value0)44宽表转长表df.melt(id_vars[城市], var_name指标, value_name值)45新增列计算df[金额] (df[数量] * df[单价]).round(2)46条件新增列np.where(cond, 是, 否)/np.select(...)47分箱pd.cut(df[金额], bins[0, 100, 1000], labels[小, 大])48横向拼接pd.concat([df1, df2], axis1)六、聚合与合并8 条#做什么写法49分组求和df.groupby(城市)[金额].sum()50多指标聚合df.groupby(城市).agg(订单数(金额, size), 销售额(金额, sum))51组内占比df[金额] / df.groupby(城市)[金额].transform(sum)52每组前 N 行df.sort_values(金额, ascendingFalse).groupby(城市).head(3)53交叉表pd.crosstab(df[城市], df[产品])54透视表pd.pivot_table(df, index城市, columns产品, values金额, aggfuncsum)55内连接df1.merge(df2, on客户ID, howleft, validatemany_to_one)56拼接多表pd.concat([df1, df2], ignore_indexTrue)七、时间序列4 条#做什么写法57取年月日df[日期].dt.year/.month/.day58取星期/季度df[日期].dt.dayofweek/.quarter59按月汇总df.resample(ME).sum()日频索引上60滚动平均df[收盘价].rolling(5).mean()把最高频的 10 条跑一遍光看表记不住跑一遍才有印象。下面把「读 → 查 → 筛 → 补 → 分组 → 排序 → 导出」串成一条链importpandasaspd# 1 读dfpd.read_csv(data/sales.csv,encodingutf-8-sig,usecols[订单日期,城市,产品,数量,单价,金额])# 2 查形状与缺失print(形状,df.shape,| 缺失,int(df.isna().sum().sum()))# 3 按条件筛bigdf[df[数量].between(3,5)]print(数量 3-5 的行数,len(big))# 4 补缺失按公式重算别填 0df[金额]df[金额].fillna((df[数量]*df[单价]).round(2))# 5 去重beforelen(df)dfdf.drop_duplicates()print(去重,before,-,len(df))# 6 分组聚合by_citydf.groupby(城市,dropnaFalse).agg(订单数(金额,size),销售额(金额,sum)).round(2)print(by_city.sort_values(销售额,ascendingFalse).to_string())# 7 排序 取前 3print(---- 销售额 Top3 ----)print(by_city.sort_values(销售额,ascendingFalse).head(3).to_string())# 8 导出importos os.makedirs(output,exist_okTrue)by_city.reset_index().to_csv(output/quickref_city.csv,indexFalse,encodingutf-8-sig)print(已导出 output/quickref_city.csv)形状 (16, 6) | 缺失 3 数量 3-5 的行数 8 去重 16 - 13 订单数 销售额 城市 杭州 5 2805.1 北京 3 1425.9 上海 2 772.5 广州 2 535.4 NaN 1 149.7 ---- 销售额 Top3 ---- 订单数 销售额 城市 杭州 5 2805.1 北京 3 1425.9 上海 2 772.5 已导出 output/quickref_city.csvimportosimportnumpyasnpimportpandasaspd os.makedirs(output,exist_okTrue)dfpd.read_csv(data/sales.csv,encodingutf-8-sig)# 9 条件新增列比 apply 快df[是否大单]np.where(df[金额].fillna(0)500,大单,普通)# 10 交叉表 透视print(城市 × 产品 订单数)print(pd.crosstab(df[城市],df[产品]).to_string())print(----)pivotpd.pivot_table(df,index城市,columns产品,values金额,aggfuncsum,fill_value0)print(透视表前两列)print(pivot.iloc[:,:2].round(1).to_string())print(----)print(是否大单分布)print(df[是否大单].value_counts().to_string())城市 × 产品 订单数 产品 A-笔记本 B-鼠标 C-键盘 D-显示器 城市 上海 0 2 2 0 北京 1 0 1 1 广州 0 2 1 0 杭州 2 1 0 2 ---- 透视表前两列 产品 A-笔记本 B-鼠标 城市 上海 0.0 299.0 北京 49.9 0.0 广州 0.0 179.4 杭州 349.3 59.8 ---- 是否大单分布 是否大单 普通 13 大单 3按问题找方法10 个高频场景表格按功能分类但人找东西是按「我想干什么」。这 10 条是问得最多的我想……用这条删掉某几列df.drop(columns[a, b])只保留某几列df[[a, b, c]]把两列合并成一列df[a].astype(str) - df[b].astype(str)拆开一列成多列df[地址].str.split(-, expandTrue)查某列有哪些值df[城市].value_counts()/.unique()找出重复的行df[df.duplicated(keepFalse)]按某列排序后重编号df.sort_values(金额).reset_index(dropTrue)计算每行占组内比例df[金额] / df.groupby(城市)[金额].transform(sum)找每组最大值那行df.loc[df.groupby(城市)[金额].idxmax()]把宽表转回长表df.melt(id_vars[城市], var_name指标, value_name值)参数速查最容易忘的几个场景参数说明CSV 中文乱码encodingutf-8-sig读、写都用它列名带 BOM同上第一列名会带\ufeff导出不带行号indexFalse90% 的导出都要加排序时空值位置na_positionfirst默认在最后合并防翻倍validatemany_to_one键重复直接报错分组保留空键dropnaFalse默认会丢掉剪裁复制警告df.loc[cond, 列] 值别先切片再赋值打印完整表df.to_string(indexFalse)或用pd.set_option常见问题Q1为什么df.groupby(城市)[金额].sum()和df.groupby(城市).sum()[金额]结果不一样前者只对金额求和后者对所有数值列求和后再取金额列。如果表里还有「数量」「单价」后者的中间结果会多算几列慢且容易误用。先选列再聚合是更清晰的写法。Q2melt和pivot_table是什么关系互为逆操作pivot_table把长表变宽表内层索引变列melt把宽表变长表列名变一列值。画图前通常要melt做报表汇总通常要pivot_table。Q3速查表里的方法记不住怎么办不用记全。真正每天用的是 15 个左右read_csv、head、info、isna、dropna、fillna、astype、groupby、agg、merge、sort_values、to_excel、loc、iloc、query。其余的查表就行——查表两分钟背下来不值。小结这份速查表按「读取 → 查看 → 选择 → 清洗 → 变形 → 聚合 → 时间 → 导出」排基本覆盖了日常 90% 的操作。建议用法收藏用的时候 CtrlF 搜关键词比如搜「去重」「透视」把常用的十几条练成肌肉记忆剩下的交给搜索。下一篇换个角度如果去面试数据分析岗这些方法会以什么形式被考20 道高频题从概念到手写。