1. 从数学建模到数据实战为什么Pandas是绕不开的基石如果你正在准备数学建模竞赛无论是国赛、美赛还是亚太杯或者你刚接手一个数据分析项目面对一堆Excel、CSV文件感到无从下手那你大概率已经听过“Pandas”这个名字。很多新手会有一个误解数学建模的核心是算法和模型Pandas只是一个处理数据的“小工具”随便学学就行。但根据我多年带队和评审的经验恰恰是这个“小工具”决定了你整个项目的下限。一个混乱、错误百出的数据集再精妙的模型也只会输出“垃圾”结论。而Pandas就是那个能让你把“脏数据”变成“干净、规整、可直接喂给模型”的瑞士军刀。简单来说Pandas是一个基于Python的、开源的数据分析和处理库。它提供了两种核心数据结构Series一维数据可以理解为带标签的数组和DataFrame二维表格可以理解为Excel中的一个工作表。正是通过这两种结构我们能够以接近自然语言比如“选择A列大于100的行”的方式高效地完成数据清洗、转换、合并、聚合和可视化等一系列繁重工作。在数学建模的流程中从拿到赛题数据到最终模型输入中间至少有70%的工作是数据预处理而Pandas能覆盖其中绝大部分场景。它让你从繁琐的循环和索引中解放出来专注于问题本身。这篇文章我不会给你罗列Pandas所有函数的API手册——那种文档网上到处都是。我会结合数学建模和实际数据分析中最常遇到的几个核心场景手把手带你走一遍从数据加载、探索、清洗到分析的完整链路。你会看到如何用几行Pandas代码替代你在Excel里可能需要手动操作几个小时甚至几天的工作。更重要的是我会分享那些官方教程里不会写的“坑”比如为什么你的数据类型总是不对导致计算错误合并数据时如何避免重复和错位以及如何写出既高效又易读的Pandas代码。我们的目标很明确让你在下次面对“2026亚太杯数学建模A题”或“商业数据分析项目”时能胸有成竹地打开Jupyter Notebook用Pandas快速打开局面。2. 环境搭建与数据初探你的第一行Pandas代码在开始任何数据分析之前一个稳定、可复现的环境是基础。很多人卡在第一步“我安装了Python但import pandas就报错”。这里我们把路径走通。2.1 搭建专属的Python数据分析环境我强烈建议你使用Anaconda来管理Python环境特别是对于数学建模和数据分析。它集成了Python、Pandas、NumPy、Matplotlib等几乎所有你需要的科学计算库并且通过conda命令可以极其方便地创建、管理和切换不同的项目环境避免库版本冲突。安装Anaconda去Anaconda官网下载对应你操作系统Windows/macOS/Linux的安装包。安装时请务必勾选“Add Anaconda to my PATH environment variable”将Anaconda添加到系统PATH这能让你在命令行中直接使用conda和python命令。创建并激活环境打开命令行Windows的CMD或Anaconda PromptmacOS/Linux的Terminal。# 创建一个名为data_analysis的新环境并指定Python版本推荐3.8或3.9兼容性最好 conda create -n data_analysis python3.9 # 激活这个环境 conda activate data_analysis激活后你的命令行提示符前面通常会显示(data_analysis)表示你已进入该环境。安装Pandas及其他核心库在激活的环境中运行以下命令。# 安装pandas conda install pandas # 安装数据分析常用库 conda install numpy matplotlib seaborn scikit-learn jupyter # 如果你喜欢用VS Code可以安装相关扩展。但Jupyter Notebook对于探索性数据分析更直观。注意网上有些教程会教你用pip install pandas。在Conda环境里优先使用conda install因为它能更好地处理库之间的依赖关系。如果你遇到某个库Conda源里没有再使用pip install作为补充。环境准备好后我推荐使用Jupyter Notebook或Jupyter Lab来编写和运行代码。它们以“单元格”为单位支持即时运行和展示结果如图表非常适合交互式数据分析。在刚才的data_analysis环境中输入jupyter lab命令即可在浏览器中打开。2.2 加载数据你的分析起点数据分析的第一步是把数据“读进来”。Pandas支持读取多种格式最常见的是CSV和Excel。import pandas as pd # 惯例将pandas导入并简称为pd import numpy as np # 通常也会一起导入numpy # 1. 读取CSV文件 df_csv pd.read_csv(your_data.csv) # 替换为你的文件路径 # 2. 读取Excel文件 df_excel pd.read_excel(your_data.xlsx, sheet_nameSheet1) # 可指定工作表 # 查看数据前5行这是了解数据长相最快的方式 print(df_csv.head()) # 查看数据基本信息行数、列数、每列数据类型、非空值数量 print(df_csv.info()) # 查看数值型列的统计摘要计数、均值、标准差、最小值、四分位数、最大值 print(df_csv.describe())实操心得read_csv功能极其强大但很多坑也在这里。比如你的数据文件是用中文分号分隔的或者编码不是UTF-8中文数据常用gbk或gb2312直接读取会乱码或报错。# 处理特殊分隔符和编码 df pd.read_csv(data.csv, sep;, encodinggbk) # 如果文件没有列名需要手动指定 df pd.read_csv(data.csv, headerNone, names[col1, col2, col3])养成使用df.info()的习惯。它能立刻告诉你数据有多少行RangeIndex每一列有多少非空值Non-Null Count以及数据类型Dtype。如果某列非空值远小于总行数说明存在大量缺失值如果一列应该是数值却显示为object说明里面混入了非数字字符需要清洗。2.3 理解DataFrame数据的“容器”DataFrame是Pandas的灵魂你可以把它想象成一个加强版的Excel表格或SQL表。它由行索引index、列索引columns和值values构成。# 假设我们有一个关于天气的DataFrame data { 城市: [北京, 上海, 广州, 深圳, 成都], 日期: [2023-10-01, 2023-10-01, 2023-10-01, 2023-10-01, 2023-10-01], 最高温度: [22, 25, 30, 31, 24], 最低温度: [10, 15, 22, 23, 16], 天气状况: [晴, 多云, 雷阵雨, 晴, 阴] } df_weather pd.DataFrame(data) print(df_weather)你会看到一个整齐的表格。选择数据是核心操作# 选择单列返回一个Series city_series df_weather[城市] # 选择多列返回一个DataFrame subset df_weather[[城市, 最高温度]] # 按行索引选择前3行 df_head df_weather.head(3) # 按条件筛选布尔索引 - 这是最常用、最强大的功能之一 sunny_cities df_weather[df_weather[天气状况] 晴] # 筛选天气为晴的行 high_temp_cities df_weather[df_weather[最高温度] 25] # 筛选最高温大于25度的行为什么这样设计Pandas的筛选逻辑基于“布尔掩码”Boolean Mask。df_weather[‘天气状况’] ‘晴’会返回一个与df_weather行数相同的布尔SeriesTrue/False将其传入df_weather[]中Pandas就会只返回对应True的行。这种向量化操作比用for循环逐行判断要快成百上千倍。3. 数据清洗与预处理从“脏数据”到“干净数据”原始数据几乎不可能是完美的。缺失值、异常值、不一致的格式、重复行……数据清洗是建模前最耗时但也最关键的一步。这一步没做好后续所有分析都是空中楼阁。3.1 处理缺失值识别与策略缺失值在Pandas中用NaNNot a Number表示。df.info()可以快速定位哪些列有缺失。# 检查每列缺失值的数量 print(df.isnull().sum()) # 检查每行缺失值的数量 print(df.isnull().sum(axis1))处理缺失值没有银弹策略取决于数据和业务逻辑删除如果缺失行占比很小且是随机缺失可以直接删除。df_dropped df.dropna() # 删除任何包含NaN的行 df_dropped_col df.dropna(axis1) # 删除任何包含NaN的列 df_dropped_subset df.dropna(subset[重要列]) # 仅在‘重要列’缺失时删除该行填充用某个统计值或插值法填充更常见。# 用该列的均值填充适用于数值列 df_filled_mean df.fillna(df.mean()) # 用该列的中位数填充对异常值更鲁棒 df_filled_median df.fillna(df.median()) # 用前一个有效值向前填充适用于时间序列 df_filled_ffill df.fillna(methodffill) # 用后一个有效值向后填充 df_filled_bfill df.fillna(methodbfill) # 对不同的列采用不同的填充策略 df[温度] df[温度].fillna(df[温度].mean()) df[城市] df[城市].fillna(未知)踩坑记录盲目用均值填充所有缺失值是大忌。例如在“石家庄天气数据分析”中如果某天风速数据缺失用全年均值填充可能完全扭曲了当天的天气状况。更好的做法是考虑用相似日期如相同季节、相同星期几的数据均值来填充或者使用更复杂的插值方法如df.interpolate()。在数学建模论文中你必须清晰陈述你处理缺失值的理由。3.2 处理异常值发现与修正异常值可能是录入错误也可能是真实但极端的情况如亿万富翁的收入。识别异常值常用统计方法如3σ原则、IQR法则或可视化箱线图。# 假设我们有一列‘销售额’ sales df[销售额] # 计算上下四分位数和IQR Q1 sales.quantile(0.25) Q3 sales.quantile(0.75) IQR Q3 - Q1 # 定义异常值边界 lower_bound Q1 - 1.5 * IQR upper_bound Q3 1.5 * IQR # 识别异常值 outliers df[(sales lower_bound) | (sales upper_bound)] print(f发现 {len(outliers)} 个异常值) # 处理异常值可以剔除也可以缩尾Winsorize或视为缺失值处理 # 方法1剔除 df_clean df[(sales lower_bound) (sales upper_bound)] # 方法2缩尾将超出边界的值替换为边界值 df[销售额_winsorized] sales.clip(lower_bound, upper_bound)核心逻辑IQR四分位距法不依赖于数据严格服从正态分布的假设比3σ原则更稳健。clip()函数是进行缩尾处理的利器。3.3 数据类型转换与标准化Pandas自动推断的数据类型有时不准。比如一个本应是数字的列因为混入了“N/A”或“-”字符会被识别为object字符串类型导致无法进行数学运算。# 查看数据类型 print(df.dtypes) # 强制转换类型 df[价格] pd.to_numeric(df[价格], errorscoerce) # 将‘价格’转为数值无法转换的变成NaN df[日期] pd.to_datetime(df[日期], format%Y-%m-%d) # 将字符串转为datetime类型便于时间序列分析 df[类别] df[类别].astype(category) # 转为分类类型节省内存提高分组性能 # 字符串操作 - Pandas的字符串方法通过.str访问器调用 df[城市] df[城市].str.upper() # 全部转为大写 df[姓名] df[姓名].str.strip() # 去除首尾空格 df[地址] df[地址].str.replace(市, 城市) # 替换字符 # 提取字符串的一部分例如从‘2023-10-01’中提取年份 df[年份] df[日期].dt.year为什么.str和.dt这么重要它们允许你对整个Series进行向量化的字符串或日期时间操作避免了低效的循环。这是Pandas高效性的关键体现之一。3.4 处理重复数据重复数据会扭曲统计结果必须清理。# 检查完全重复的行 duplicates df.duplicated() print(f完全重复的行数: {duplicates.sum()}) # 删除完全重复的行保留第一次出现的 df_unique df.drop_duplicates() # 基于某几列检查重复例如同一‘用户ID’和‘日期’不应有两条记录 df_unique_subset df.drop_duplicates(subset[用户ID, 日期]) # 查看被删除的重复行 df_duplicated df[df.duplicated(keepFalse)] # keepFalse标记所有重复项4. 数据转换与特征工程为建模做准备清洗干净的数据往往还需要进行转换和衍生才能成为模型喜欢的“特征”。这一步是区分普通分析和高级分析的关键。4.1 应用函数与映射批量处理数据apply()函数允许你将一个自定义函数应用到DataFrame的每一行或每一列。# 示例根据温度添加一个‘体感’列 def feel_temperature(temp): if temp 10: return 寒冷 elif temp 25: return 舒适 else: return 炎热 df[体感] df[最高温度].apply(feel_temperature) # 对于更简单的映射可以用map函数或字典映射 weather_map {晴: sunny, 多云: cloudy, 雷阵雨: stormy} df[weather_en] df[天气状况].map(weather_map) # 对多列进行操作 def calculate_range(row): return row[最高温度] - row[最低温度] df[温差] df.apply(calculate_range, axis1) # axis1表示按行应用性能提示apply虽然灵活但速度较慢尤其是数据量大时。如果操作可以用向量化的Pandas内置函数或NumPy函数实现应优先使用后者。例如上面的温差计算完全可以用向量化操作df[‘温差’] df[‘最高温度’] - df[‘最低温度’]这比apply快得多。4.2 数据分组与聚合洞察的源泉分组聚合是数据分析的核心回答诸如“每个城市的平均温度是多少”、“每月销售额总和是多少”这类问题。# 按‘城市’分组计算‘最高温度’的平均值 grouped_city df.groupby(城市)[最高温度].mean() print(grouped_city) # 按‘城市’和‘天气状况’进行多级分组并计算多个聚合指标 grouped_multi df.groupby([城市, 天气状况]).agg({ 最高温度: [mean, max, min, count], 最低温度: mean }) print(grouped_multi) # 重置索引将分组键变回列 grouped_reset grouped_multi.reset_index()groupby的过程可以理解为“拆分-应用-合并”拆分根据指定的键如‘城市’将DataFrame分成多个组。应用对每个分组独立应用聚合函数如mean,sum,count。合并将各组的计算结果合并成一个新的数据结构。高级技巧transform函数。它与agg类似但返回一个与原始DataFrame行数相同的对象常用于创建新的特征列。例如计算每个城市温度相对于该城市平均温度的偏差df[城市平均温度] df.groupby(城市)[最高温度].transform(mean) df[温度偏差] df[最高温度] - df[城市平均温度]4.3 数据合并与连接整合多源信息数学建模中数据常常来自多个表格如用户信息表、订单表、商品表。Pandas提供了类似SQL的合并功能。# 假设有两个DataFrame df_orders pd.DataFrame({order_id: [1,2,3], customer_id: [101, 102, 101], amount: [50, 150, 80]}) df_customers pd.DataFrame({customer_id: [101, 102, 103], name: [Alice, Bob, Charlie]}) # 1. 内连接 (inner join): 只保留两个表都有的键 df_inner pd.merge(df_orders, df_customers, oncustomer_id, howinner) # 2. 左连接 (left join): 以左表为主保留所有行 df_left pd.merge(df_orders, df_customers, oncustomer_id, howleft) # 3. 外连接 (outer join): 保留所有键缺失值用NaN填充 df_outer pd.merge(df_orders, df_customers, oncustomer_id, howouter) # 按索引连接 df_concat pd.concat([df1, df2], axis0) # 纵向堆叠 (增加行) df_concat_col pd.concat([df1, df2], axis1) # 横向拼接 (增加列)常见大坑合并后数据行数激增这通常是出现了“多对多”关系而你没有意识到。务必在合并前用df[‘key_column’].value_counts()检查键值的唯一性。另一个坑是列名重复Pandas会自动添加后缀_x,_y需要留意。5. 数据分析与可视化让数据说话数据处理完毕后我们需要从中提取信息。描述性统计和可视化是最直观的手段。5.1 描述性统计与交叉分析describe()给出了数值列的概览但对于分类数据我们需要其他工具。# 分类变量的频数统计 weather_counts df[天气状况].value_counts() print(weather_counts) weather_counts_percent df[天气状况].value_counts(normalizeTrue) # 计算比例 print(weather_counts_percent) # 交叉表 (Crosstab)查看两个分类变量之间的关系 cross_tab pd.crosstab(df[城市], df[天气状况]) print(cross_tab) # 可以添加边际和总计 cross_tab_margins pd.crosstab(df[城市], df[天气状况], marginsTrue, margins_name总计)透视表Pivot Table是更强大的多维数据分析工具它重塑数据让你可以从不同维度进行聚合。# 创建一个透视表以‘城市’为行‘天气状况’为列值为‘最高温度’的平均值 pivot_table df.pivot_table(values最高温度, index城市, columns天气状况, aggfuncmean) print(pivot_table) # 可以指定多个聚合函数 pivot_table_multi df.pivot_table(values最高温度, index城市, columns天气状况, aggfunc[mean, count, max])5.2 数据可视化一图胜千言Pandas集成了Matplotlib可以非常方便地绘制基本图表。对于更复杂的图表可以结合Seaborn库。import matplotlib.pyplot as plt # 设置中文字体如果需要显示中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 # 1. 折线图 - 常用于时间序列 # 假设我们有一个按日期排序的温度数据 df_time df.sort_values(日期) df_time.set_index(日期)[最高温度].plot(figsize(10,6), title每日最高温度变化, gridTrue) plt.ylabel(温度 (°C)) plt.show() # 2. 柱状图 - 比较不同类别的数值 df[城市].value_counts().plot(kindbar, figsize(8,5), colorskyblue, edgecolorblack) plt.title(城市数据量分布) plt.xlabel(城市) plt.ylabel(计数) plt.show() # 3. 箱线图 - 查看分布和异常值 df.boxplot(column最高温度, by城市, figsize(10,6)) plt.title(各城市最高温度分布) plt.suptitle() # 去除默认的标题 plt.ylabel(温度 (°C)) plt.show() # 4. 散点图 - 查看两个数值变量间的关系 plt.figure(figsize(8,5)) plt.scatter(df[最高温度], df[最低温度], alpha0.6) plt.xlabel(最高温度 (°C)) plt.ylabel(最低温度 (°C)) plt.title(最高温度与最低温度关系散点图) plt.grid(True) plt.show() # 5. 直方图 - 查看单个数值变量的分布 df[最高温度].plot(kindhist, bins20, edgecolorblack, figsize(8,5)) plt.title(最高温度分布直方图) plt.xlabel(温度 (°C)) plt.ylabel(频数) plt.show()可视化最佳实践图表选择比较类别用柱状图看趋势用折线图看分布用直方图或箱线图看关系用散点图。信息密度避免在一个图中塞入过多信息。使用子图plt.subplots来并排展示多个相关图表。标注清晰永远给图表加上标题title和坐标轴标签xlabel,ylabel。使用图例legend区分多条线或多个系列。保存图表在Notebook中显示后可以使用plt.savefig(‘figure.png’, dpi300, bbox_inches‘tight’)保存高清图片用于论文或报告。6. 实战演练一个完整的迷你数据分析流程让我们用一个虚构但贴近数学建模的场景来串联以上所有技能。假设我们拿到一份“某连锁奶茶店2023年部分城市销售数据”模拟“商业数据分析”或“数学建模国赛C题”风格的数据。任务分析销售情况找出业绩最好的城市和产品并探索销售额与气温的可能关系。import pandas as pd import numpy as np import matplotlib.pyplot as plt # 1. 创建模拟数据 np.random.seed(42) # 确保每次运行结果一致 dates pd.date_range(2023-01-01, 2023-12-31, freqD) cities [北京, 上海, 广州, 深圳] products [珍珠奶茶, 芝士奶盖, 水果茶, 拿铁咖啡] data [] for date in dates: for city in cities: for product in products: # 模拟销售额基础值 城市因子 产品因子 随机波动 季节性 base_sale 100 city_factor {北京: 1.1, 上海: 1.3, 广州: 1.0, 深圳: 1.2}[city] product_factor {珍珠奶茶: 1.5, 芝士奶盖: 1.2, 水果茶: 1.0, 拿铁咖啡: 0.8}[product] seasonal 50 * np.sin(2 * np.pi * (date.dayofyear / 365)) # 简单季节性模拟 noise np.random.normal(0, 20) sales max(0, int(base_sale * city_factor * product_factor seasonal noise)) # 模拟温度简单模拟北方冷南方热有季节变化 if city in [北京]: temp 10 15 * np.sin(2 * np.pi * (date.dayofyear / 365 - 0.25)) np.random.normal(0, 5) elif city in [上海]: temp 15 10 * np.sin(2 * np.pi * (date.dayofyear / 365 - 0.25)) np.random.normal(0, 5) else: # 广州、深圳 temp 22 8 * np.sin(2 * np.pi * (date.dayofyear / 365 - 0.25)) np.random.normal(0, 5) data.append([date, city, product, sales, round(temp, 1)]) df_sales pd.DataFrame(data, columns[日期, 城市, 产品, 销售额, 日均温度]) print(数据概览:) print(df_sales.head()) print(df_sales.info()) # 2. 数据清洗与探索假设数据已较干净我们直接探索 # 按城市汇总销售额 city_sales df_sales.groupby(城市)[销售额].sum().sort_values(ascendingFalse) print(\n各城市总销售额排名:) print(city_sales) # 按产品汇总销售额 product_sales df_sales.groupby(产品)[销售额].sum().sort_values(ascendingFalse) print(\n各产品总销售额排名:) print(product_sales) # 3. 深入分析各城市各产品的销售额透视表 pivot_city_product df_sales.pivot_table(values销售额, index城市, columns产品, aggfuncsum) print(\n各城市-产品销售额透视表:) print(pivot_city_product) # 4. 可视化 fig, axes plt.subplots(2, 2, figsize(14, 10)) # 子图1各城市销售额柱状图 city_sales.plot(kindbar, axaxes[0, 0], colorteal, edgecolorblack) axes[0, 0].set_title(各城市总销售额对比) axes[0, 0].set_ylabel(销售额) axes[0, 0].tick_params(axisx, rotation45) # 子图2各产品销售额柱状图 product_sales.plot(kindbar, axaxes[0, 1], colorcoral, edgecolorblack) axes[0, 1].set_title(各产品总销售额对比) axes[0, 1].set_ylabel(销售额) axes[0, 1].tick_params(axisx, rotation45) # 子图3北京各产品月度销售额趋势折线图 df_beijing df_sales[df_sales[城市] 北京].copy() df_beijing[年月] df_beijing[日期].dt.to_period(M) # 提取年月 monthly_beijing df_beijing.groupby([年月, 产品])[销售额].sum().unstack() monthly_beijing.plot(axaxes[1, 0], markero) axes[1, 0].set_title(北京地区各产品月度销售额趋势) axes[1, 0].set_ylabel(销售额) axes[1, 0].legend(title产品) axes[1, 0].tick_params(axisx, rotation45) # 子图4销售额与温度的散点图以北京为例 axes[1, 1].scatter(df_beijing[日均温度], df_beijing[销售额], alpha0.3, s10) axes[1, 1].set_xlabel(日均温度 (°C)) axes[1, 1].set_ylabel(销售额) axes[1, 1].set_title(北京地区销售额与温度关系散点图) # 尝试添加趋势线简单线性拟合 z np.polyfit(df_beijing[日均温度], df_beijing[销售额], 1) p np.poly1d(z) axes[1, 1].plot(df_beijing[日均温度].sort_values(), p(df_beijing[日均温度].sort_values()), r--, linewidth2, labelf趋势线: y{z[0]:.1f}x{z[1]:.1f}) axes[1, 1].legend() axes[1, 1].grid(True) plt.tight_layout() plt.show() # 5. 简单结论 print(\n--- 初步分析结论 ---) print(f1. 总销售额最高的城市是{city_sales.index[0]} ({city_sales.iloc[0]:,})) print(f2. 最受欢迎的产品是{product_sales.index[0]} ({product_sales.iloc[0]:,})) print(f3. 从北京的趋势图看水果茶和芝士奶盖在夏季对应图表右侧高温区间销售额有上升趋势。) print(f4. 散点图显示在一定范围内温度与销售额可能存在微弱的正相关关系趋势线斜率为正但数据点非常分散关系不强烈需要更严谨的统计分析如计算相关系数。)这个流程展示了一个从数据生成模拟、加载、聚合、透视到可视化的完整闭环。在真实的数学建模中你还需要进行更严格的统计检验、建立预测模型等但Pandas为你铺平了前80%的道路。7. 性能优化与高级技巧当数据量变大时当处理数十万、百万行数据时一些操作会变慢。以下是一些提升效率的技巧使用合适的数据类型category类型用于低基数唯一值少的字符串列能大幅减少内存占用和加速groupby操作。int8,int16,float32等可以替代默认的int64,float64来节省内存。避免循环使用向量化操作这是Pandas的第一准则。能用df[‘col’] * 2就不要用for循环。使用.loc和.iloc进行索引它们比直接链式索引如df[df[‘a’]1][‘b’]更高效、更安全。.loc基于标签.iloc基于整数位置。# 高效且清晰的选择方式 df.loc[df[‘温度’] 30, [‘城市’, ‘日期’]]警惕SettingWithCopyWarning当你尝试修改一个可能是切片副本的DataFrame时会弹出此警告。正确的做法是使用.loc明确指定或者使用.copy()创建副本。# 可能引发警告的写法 df_subset df[df[‘城市’] ‘北京’] df_subset[‘新列’] 1 # SettingWithCopyWarning! # 正确的写法1使用.loc df.loc[df[‘城市’] ‘北京’, ‘新列’] 1 # 正确的写法2明确复制 df_subset df[df[‘城市’] ‘北京’].copy() df_subset[‘新列’] 1考虑使用Dask或Vaex处理超大数据集当数据超出内存时Pandas会力不从心。Dask提供了类似Pandas的API可以进行并行和核外计算。Vaex则采用内存映射和惰性求值能高效处理数十亿行数据。8. 在数学建模中应用Pandas工作流与报告输出在数学建模竞赛中时间管理至关重要。一个基于Pandas的清晰工作流能帮你节省大量时间。数据理解阶段用df.head(),df.info(),df.describe(),df.isnull().sum()快速了解数据全貌、规模、类型和缺失情况。用简单的可视化如df.hist()查看分布。数据清洗与预处理阶段系统性地处理缺失值、异常值、类型转换、重复值。将清洗逻辑写成函数或管道pd.pipe确保过程可复现。务必保存清洗前后的数据副本并在论文中说明每一步的处理方法和理由。特征工程与探索阶段基于业务理解赛题背景和可视化洞察创建新的特征如从日期中提取星期几、是否节假日计算统计量如滚动均值。使用groupby、pivot_table和交叉表进行多维分析。建模准备阶段将处理好的DataFrame转换为模型所需的NumPy数组或特定格式如df.values或df[[‘feature1’, ‘feature2’]].to_numpy()。使用train_test_split等工具划分训练集和测试集。结果分析与报告输出将模型预测结果合并回原始DataFrame便于分析如df[‘预测值’] predictions。使用Pandas生成清晰的汇总表格可以直接导出为LaTeX或Markdown格式插入论文。# 将关键结果DataFrame输出为CSV或LaTeX summary_table.to_csv(‘result_summary.csv’, indexFalse) print(summary_table.to_latex(indexFalse)) # 复制输出到论文LaTeX中最后一点个人体会Pandas的强大在于其表达力——你几乎可以用一句接近自然语言的代码完成复杂的数据操作。但它的学习曲线在于理解其底层基于索引和轴的操作逻辑。我建议新手不要死记硬背所有函数而是掌握几个核心概念DataFrame/Series, 索引布尔筛选分组聚合合并然后在实际项目中反复使用。遇到问题时善用搜索引擎和官方文档。当你能够不假思索地用Pandas流利地“对话”你的数据时你就已经掌握了数据分析中最具生产力的一环。在数学建模中这节省下来的时间足以让你在模型构建和论文写作上建立巨大优势。