ARTICLE · 1356135
Excel处理数据太慢?这10个Pandas技巧,建议码住收藏!
你有没有遇到过这样的情况:几个部门发来不同的 Excel 表格,需要逐个打开、复制、粘贴,再反复核对数据;一份表格数据量稍微大一点,筛选、统计就变得很慢;每个月都要重复做同样的报表,步骤多还容易出错。
如果这些工作经常发生,可以试试 Python 的 Pandas。它是一个常用的数据处理工具,能够帮助我们完成数据读取、清洗、筛选、合并、统计和导出等操作。把重复步骤写成代码后,下次遇到同类任务,就不用再从头手动操作。
需要说明的是,Pandas 并不是在所有情况下都比 Excel 快,也不是要完全取代 Excel。它更适合数据量较大、步骤重复、规则明确的处理任务;最终效率还会受到电脑内存、数据结构和代码写法影响。
为什么用 Pandas 处理数据?
·批量处理:适合重复读取、清洗和整理多份数据文件。
·灵活筛选:可以组合多个条件,完成比简单筛选器更复杂的规则。
·快速汇总:分组统计、数据透视和表格合并都可以用代码完成。
·方便复用:把常用步骤保存成脚本,下次只需替换数据文件或参数。
开始之前:安装 Pandas
如果电脑已经安装 Python,可以打开终端或命令提示符,执行下面这条命令:
</> | Terminal · Code |
1 | pip install pandas openpyxl xlsxwriter |
其中,pandas 用于数据处理;openpyxl 常用于读取或写入 .xlsx 文件;xlsxwriter 可用于生成带格式的 Excel 文件。若只处理 CSV 文件,通常先安装 pandas 就可以。
下面的示例默认已经导入 Pandas,并且数据表中的字段名称与代码一致。实际使用时,请把示例里的文件名和列名替换成自己的。
10个Pandas 技巧
01|数据导入优化:读取时就设定数据类型
适用场景:读取 CSV 文件时,如果提前知道字段的数据类型,可以在导入时指定,减少不必要的类型推断和内存占用。
</> | Python · Code |
1 | importpandas aspd |
2 | |
3 | # 读取时指定字段类型 |
4 | dtypes ={ |
5 | "user_id":"int32", |
6 | "price":"float32" |
7 | } |
8 | |
9 | df =pd.read_csv( |
10 | "data.csv", |
11 | dtype=dtypes, |
12 | parse_dates=["order_time"] |
13 | ) |
怎么理解:dtype 用来指定列的数据类型;parse_dates 可以在读取时解析日期列。这样后续处理日期和数值时会更方便。
小提醒 示例中的列名必须真实存在于 CSV 文件中。int32 适用于数值范围足够小且没有缺失值的整数列;如果该列可能有缺失值,可考虑使用 Pandas 的可空类型 Int32。 |
02|替代 VLOOKUP:用 merge 合并表格
适用场景:订单表里只有用户编号,但你还需要补充用户姓名、地区或会员等级时,可以通过 merge 按共同字段匹配两张表。
</> | Python · Code |
1 | # 按用户编号,将用户信息合并到订单表 |
2 | df_merged =pd.merge( |
3 | df_orders, |
4 | df_users, |
5 | how="left", |
6 | left_on="user_id", |
7 | right_on="id" |
8 | ) |
怎么理解:how='left' 表示保留左侧订单表的全部记录,再从用户表中匹配对应信息。left_on 和 right_on 分别指定两张表用于匹配的字段。
小提醒 合并前先检查两张表的匹配字段是否有重复值。右表的匹配键如果存在重复记录,一条订单可能匹配出多行结果,导致合并后的行数增加。 |
03|多条件筛选:一次筛出符合要求的数据
适用场景:例如,只想查看年龄大于 18 岁、城市属于北京或上海,并且手机号不为空的记录。
</> | Python · Code |
1 | df_filtered =df.loc[ |
2 | (df["age"]> 18) |
3 | & (df["city"].isin(["北京", "上海"])) |
4 | & (df["phone"].notna()) |
5 | ].copy() |
怎么理解:每个筛选条件都用括号括起来;& 表示同时满足,| 表示满足其中一个,~ 表示取反。isin() 可以判断某列是否属于指定列表,notna() 用来排除缺失值。
小提醒 Pandas 中多个条件组合时要使用 &、|、~,不要直接写 Python 的 and、or、not。 |
04|GroupBy 分组统计:快速找出每个城市的销售 Top 3
适用场景:当你需要按城市、产品汇总销售额,并找出每个城市销量或销售额排名靠前的产品时,可以先分组汇总,再排序取前几名。
</> | Python · Code |
1 | # 先按城市和产品汇总销售额 |
2 | city_product =( |
3 | df.groupby(["city", "product"], as_index=False)["sales"] |
4 | .sum() |
5 | ) |
6 | |
7 | # 每个城市按销售额从高到低排序,取前 3 名 |
8 | top3_by_city =( |
9 | city_product |
10 | .sort_values( |
11 | ["city", "sales"], |
12 | ascending=[True, False] |
13 | ) |
14 | .groupby("city", group_keys=False) |
15 | .head(3) |
16 | ) |
怎么理解:groupby() 负责分组,sum() 负责求和,sort_values() 负责排序,head(3) 则取每组前 3 条记录。几个操作组合起来,就能完成一项常见的报表任务。
小提醒 这里的 Top 3 是按 sales 销售额排序。如果你想按数量、利润或其他指标排名,只需要替换对应字段。 |
05|日期处理:提取年份、周数和是否周末
适用场景:分析订单、考勤或销售记录时,经常需要按年份、月份、星期或工作日/周末进行统计。
</> | Python · Code |
1 | # 将日期列转换为日期类型 |
2 | df["date"]=pd.to_datetime(df["date"], errors="coerce") |
3 | |
4 | # 提取年份 |
5 | df["year"]=df["date"].dt.year |
6 | |
7 | # 提取 ISO 周数 |
8 | df["week"]=df["date"].dt.isocalendar().week |
9 | |
10 | # 判断是否为周末:周一=0,周日=6 |
11 | df["is_weekend"]=df["date"].dt.dayofweek >= 5 |
怎么理解:先用 pd.to_datetime() 把日期列转换为日期类型,再通过 .dt 访问器提取年份、周数和星期信息。这样就能进一步按时间维度进行汇总。
小提醒 无法识别的日期会在 errors='coerce' 时变成缺失值 NaT。处理前最好检查原始日期格式是否统一。 |
06|字符串处理:批量提取和查找关键词
适用场景:比如从手机号中提取前三位,或者判断营销活动名称里是否包含“优惠”两个字。
</> | Python · Code |
1 | # 统一转为字符串类型,再提取手机号前三位 |
2 | df["phone"]=df["phone"].astype("string") |
3 | df["mobile_prefix"]=df["phone"].str[:3] |
4 | |
5 | # 判断活动名称是否包含指定关键词 |
6 | df["campaign_flag"]=( |
7 | df["campaign"] |
8 | .astype("string") |
9 | .str.contains("优惠", na=False) |
10 | ) |
怎么理解:str[:3] 可以批量截取字符串前三位;str.contains() 可以批量判断是否包含某个关键词。na=False 表示遇到缺失值时按 False 处理。
小提醒 如果手机号列被 Excel 读成数字,前导 0 可能已经丢失。涉及手机号、身份证号等编号字段时,建议在读取文件时就按字符串处理。 |
07|数据透视表:按城市和类别汇总指标
适用场景:如果你想快速查看不同城市、不同商品类别的平均销售额,可以用 pivot_table() 生成交叉汇总表。
</> | Python · Code |
1 | pivot =pd.pivot_table( |
2 | df, |
3 | index="city", |
4 | values="sales", |
5 | columns="category", |
6 | aggfunc="mean", |
7 | margins=True, |
8 | fill_value=0 |
9 | ) |
怎么理解:index 指定行维度,columns 指定列维度,values 指定需要统计的数值列,aggfunc 指定统计方式。这里使用 mean 计算平均值;margins=True 会增加汇总行和汇总列。
小提醒 如果你需要总销售额,把 aggfunc='mean' 改成 aggfunc='sum';如果需要计数,可以使用 aggfunc='count'。 |
08|批量计算:优先使用向量化操作
适用场景:例如,整张订单表都需要按原价的 9 折计算折后价,不需要一行一行循环处理。
</> | Python · Code |
1 | # 推荐:一次性对整列进行计算 |
2 | df["discount"]=df["price"]* 0.9 |
3 | |
4 | # 也可以按条件计算,例如价格达到 100 元才打九折 |
5 | df["final_price"]=df["price"].where( |
6 | df["price"]< 100, |
7 | df["price"]* 0.9 |
8 | ) |
怎么理解:Pandas 支持对整列进行批量运算,这类向量化写法通常比逐行使用 for 循环和 .loc 赋值更简洁,也往往更高效。
小提醒 原图将这一项写作“高效循环”,但示例中的逐行循环并不是推荐的高效写法。实际处理时,优先考虑向量化计算;确实需要逐行处理复杂逻辑时,再选择合适的迭代方式。 |
09|Excel 导出:保存结果并添加条件格式
</> | Python · Code |
1 | # 需要先安装:pip install xlsxwriter |
2 | |
3 | withpd.ExcelWriter( |
4 | "report.xlsx", |
5 | engine="xlsxwriter" |
6 | )aswriter: |
7 | df.to_excel( |
8 | writer, |
9 | sheet_name="数据", |
10 | index=False |
11 | ) |
12 | |
13 | workbook =writer.book |
14 | worksheet =writer.sheets["数据"] |
15 | |
16 | # 为 B 列中大于 1000 的数值设置红色背景 |
17 | ifnotdf.empty: |
18 | format_red =workbook.add_format({ |
19 | "bg_color":"#FFC7CE" |
20 | }) |
21 | |
22 | worksheet.conditional_format( |
23 | f"B2:B{len(df)+ 1}", |
24 | { |
25 | "type":"cell", |
26 | "criteria":">", |
27 | "value":1000, |
28 | "format":format_red |
29 | } |
30 | ) |
31 | |
32 | # 如果还需要导出 CSV |
33 | df.to_csv( |
34 | "report.csv", |
35 | index=False, |
36 | encoding="utf-8-sig" |
37 | ) |
怎么理解:ExcelWriter 可以把数据写入指定工作表;使用 xlsxwriter 引擎时,还能进一步设置条件格式。导出 CSV 时使用 utf-8-sig,通常更方便 Windows 版 Excel 识别中文。
小提醒 这段条件格式示例默认要标色的是 Excel 的 B 列。请根据实际表格调整列范围和判断阈值。这里明确指定 engine='xlsxwriter',因为代码使用了 xlsxwriter 的 add_format() 接口。 |
10|大文件处理:减少内存占用
适用场景:当 CSV 文件比较大时,可以尝试优化字段类型,并使用 chunksize 分块读取,避免一次性把整个文件读入内存。
</> | Python · Code |
1 | # 将数值列转换为更合适的类型 |
2 | df["user_id"]=pd.to_numeric( |
3 | df["user_id"], |
4 | errors="coerce" |
5 | ).astype("Int32") |
6 | |
7 | # 对重复值较多的文本列,可尝试 category |
8 | df["description"]=df["description"].astype("category") |
9 | |
10 | # 分块读取大文件,并逐块写出处理结果 |
11 | first_chunk =True |
12 | |
13 | forchunk inpd.read_csv( |
14 | "huge_file.csv", |
15 | chunksize=100_000 |
16 | ): |
17 | # 在这里对当前数据块进行清洗、筛选或计算 |
18 | chunk.to_csv( |
19 | "processed_output.csv", |
20 | mode="w"iffirst_chunk else"a", |
21 | header=first_chunk, |
22 | index=False, |
23 | encoding="utf-8-sig" |
24 | ) |
25 | first_chunk =False |
怎么理解:astype() 可以调整字段类型;category 适合类别重复较多的文本列。chunksize=100_000 表示每次读取约 10 万行,处理完一块再继续读取下一块。
小提醒 仅仅把所有分块重新 concat 到一起,仍然可能占用大量内存,不能真正发挥分块读取的优势。大文件场景下,更适合逐块完成清洗、统计或写出结果。Int32 是 Pandas 可空整数类型;如果字段没有缺失值且范围合适,也可以考虑 int32。 |
实际使用时,记住这几个小习惯
1.先检查列名:代码中的字段名称要和 Excel / CSV 表头完全一致。
2.先用小样本测试:正式处理整份文件前,可以先读取少量数据,确认代码逻辑正确。
3.留意缺失值和重复值:合并、筛选、分组之前,先检查数据是否完整。
4.保留原始文件:尽量把处理结果另存为新文件,不要直接覆盖原始数据。
5.不要盲目追求“快”:先保证结果正确,再根据数据量和运行时间优化代码。
写在最后:
Excel 依然是日常办公中非常好用的工具,但当数据量变大、操作步骤变多,或者每个月都要重复做同一套报表时,Pandas 能帮我们把不少机械操作变成可复用的代码。
这 10 个技巧覆盖了数据导入、合并、筛选、分组、日期处理、字符串处理、透视表、批量计算、导出和大文件读取。刚开始不用一次全部记住,可以先挑一个自己工作中最常遇到的场景,照着示例跑通,再慢慢把它变成自己的小工具。















































































