import pandas as pd
# Original data (Note: Q2 and Q4 are missing)
data ={'Quarter':['Q1','Q3'],'Sales':[15000,18000]}
df = pd.read_json(pd.DataFrame(data).to_json())# Simulating loaded data
df = df.set_index('Quarter')# The complete index we REQUIRE for the report
all_quarters =['Q1','Q2','Q3','Q4']# Reindex forces Q2 and Q4 to appear, filling them with 0 instead of NaN
df_full = df.reindex(all_quarters, fill_value=0)技术支持
import pandas as pd
data ={'Name':['John','Cataline','Matt'],'Age':[50,45,30],'City':['Austin','San Francisco','Boston'],'Marks':[70,80,95]}
df = pd.DataFrame(data)技术支持
从列表的列表:
import pandas as pd
data =[['John',25,'Austin',70],['Cataline',30,'San Francisco',80],['Matt',35,'Boston',90]]
columns =['Name','Age','City','Marks']
df = pd.DataFrame(data, columns=columns)技术支持
10. 如何获取 DataFrame 中某个分类型列所有唯一值的计数?
函数 Series.value_counts() 会返回某个 Series 或列中每个唯一值的计数。
示例:
我们创建了一个包含名为 Sex 的分类型列的 DataFrame df,并运行 .value_counts() 查看该列中每个唯一值的计数。
import pandas as pd
data =[['John',50,'Male','Austin',70],['Cataline',45,'Female','San Francisco',80],['Matt',30,'Male','Boston',95]]# Column labels of the DataFrame
columns =['Name','Age','Sex','City','Marks']# Create a DataFrame df
df = pd.DataFrame(data, columns=columns)
df['Sex'].value_counts()技术支持
import pandas as pd
#input your excel file path into the read_excel() function.
excel_data = pd.read_excel("/content/sample_data/california_housing_test.xlsx")
excel_data.to_csv("CSV_data.csv", index =None, header=True)技术支持
import pandas as pd
data =[['John',50,'Male','Austin',70],['Cataline',45,'Female','San Francisco',80],['Matt',30,'Male','Boston',95],['Oliver',35,'Male','New york',65]]# Column labels of the DataFrame
columns =['Name','Age','Sex','City','Marks']# Create a DataFrame df
df = pd.DataFrame(data, columns=columns)# Sort values based on ‘Age’ column
df.sort_values(by=['Age'])
df.head()`技术支持
19. 展示两种不同的数据筛选方法
我们用如下 DataFrame 来演示如何筛选:
import pandas as pd
data ={'Name':['John','Cataline','Matt'],'Age':[50,45,30],'City':['Austin','San Francisco','Boston'],'Marks':[70,80,95]}# Create a DataFrame df
df = pd.DataFrame(data)技术支持
import pandas as pd
# Create a DataFrame
data ={'Name':['John','Matt','John','Matt','Matt','Matt'],'Grades':[10,20,30,15,25,18]}# Create a DataFrame df
df = pd.DataFrame(data)# mean marks of John and Mattprint(df.groupby('Name').agg(
avg_grade=('Grades','mean'),)技术支持
在本文中,我整理了最常被问到的 Pandas 面试题及其答案。其中一些问题来自我在 Target 担任数据科学家职位的亲身面试经历。让我们开始吧!
Pandas 基础面试题
先来看一些关于 pandas 的基础面试题。友善的面试官可能会用这些简单问题帮助您进入状态,另外一些面试官则会用它们来评估您对该库的基本掌握程度。
1. Python 中的 pandas 是什么?
pandas是一个开源的 Python 库,内置了强大的方法,可高效地清洗、分析和处理数据集。它由 Wes McKinney 于 2008 年开发,能够轻松与 Python 中的各类数据科学模块配合使用。虽然最初构建在
NumPy之上,但现代pandas(v2.0+)也支持 PyArrow 后端。这带来了显著更快的操作、真正的字符串数据类型,以及相比仅用旧版NumPy架构更优秀的缺失值(可空类型)处理。2. 如何快速查看 pandas DataFrame 的前 5 行和后 5 行?
在
pandas中,使用head()方法获取 DataFrame 的前 5 行,使用tail()方法获取后 5 行。获取前 5 行:
dataframe_name.head()获取后 5 行:
dataframe_name.tail()3. 为什么 DataFrame.shape 没有括号?
在
pandas中,shape是属性而不是方法。因此访问时不需要加括号。DataFrame.shape会返回一个元组,包含 DataFrame 的行数和列数。4. Series 与 DataFrame 有何区别?
DataFrame:
pandas的 DataFrame 是表格格式,包含多行多列,每一列可以是不同的数据类型。Series: Series 是一维带标签的数组,可以存储任意数据类型,但其所有值应为相同的数据类型。Series 更像是 DataFrame 的单独一列。
Series 比 DataFrame 更省内存,因此在其上进行某些数据处理会更快。
不过,DataFrame 能存储更大、更复杂的数据集,而 Series 只能处理同质数据。因此,您在 DataFrame 上可执行的操作集合远多于 Series。
5. pandas 中的索引(index)是什么?
索引是一组标签,可唯一标识 DataFrame 的每一行。索引可以是任意数据类型(如整数、字符串、哈希等)。
df.index会打印 DataFramedf当前的行索引。Pandas 进阶面试题
这些问题会稍有挑战,更常见于需要有 pandas 使用经验的岗位。
6. pandas 中的多重索引(multi-index)是什么?
在
pandas中,索引用于唯一标识 DataFrame 的每一行。我们通常选择能唯一标识每一行的列来设为索引。但如果没有单个列能做到这一点怎么办?例如,某个 DataFrame 有 “name”“age”“address”“marks” 四列。上述任意一列都可能存在重复值,不适合作为索引。
但是,“name”和“address”两列组合起来也许能唯一标识每一行。因此您可以同时将这两列设为索引。此时您的 DataFrame 就拥有了多重(分层)索引。
7. 解释 pandas 的 reindexing。给出一个示例。
重建索引(Reindexing)用于让 DataFrame 服从一个新的索引。它最常用于填补时间序列中的缺口,或确保报告包含所有类别,即便其值为零。
如果新索引包含原 DataFrame 中不存在的标签,
pandas会为这些行引入NaN(或指定的填充值)。示例: 假设您有 Q1 和 Q3 的销售数据,但因为销售为零,Q2 和 Q4 缺失。普通的可视化会产生误导。通过
reindex()强制将缺失的季度加入 DataFrame 就能修正这一问题。8. loc 与 iloc 有何区别?
在 pandas 中,
.loc()和.iloc()都用于选择 DataFrame 的子集。实际工作中,它们广泛用于按条件筛选 DataFrame。当使用行列的实际标签来选择数据时,应使用
.loc();而基于行列的整数位置来提取数据时,使用.iloc()。9. 展示两种创建 pandas DataFrame 的方法
从字典:
从列表的列表:
10. 如何获取 DataFrame 中某个分类型列所有唯一值的计数?
函数
Series.value_counts()会返回某个 Series 或列中每个唯一值的计数。示例:
我们创建了一个包含名为
Sex的分类型列的 DataFrame df,并运行.value_counts()查看该列中每个唯一值的计数。如果您希望查看百分比分布而非原始计数,可在
.value_counts()中使用参数normalize=True。11. 什么是 category 数据类型,为什么要使用它?
category数据类型用于具有有限唯一字符串值(低基数)的列。它能大幅节省内存,并加速排序、分组等操作,因为 Pandas 仅在查找表中存储一次字符串,而在实际数据列中使用轻量的整数。面向有经验从业者的 Pandas 面试题
如果您已具备扎实的
pandas背景并申请更资深的岗位,可能会遇到如下问题:12. 如何在 pandas 中优化大数据集的性能?
使用 PyArrow: 在加载数据时使用
engine="pyarrow"和dtype_backend="pyarrow"。这比标准的NumPy类型更快且更省内存。用向量化替代循环: 循环与迭代的开销很大,尤其在处理大数据集时。优先选择向量化操作,因为它一次性作用于整列,比逐行迭代更快。
只加载所需列: 在
read_csv()或read_parquet()中使用usecols参数限制加载数据量。内存友好型数据类型:
pandas的默认数据类型并不省内存。例如,整数默认是int64,但如果值能装入int32,将类型调整为int32可优化内存使用。将低基数字符串转换为category也是好做法。使用数据聚合: 尝试先进行聚合和统计操作,因为对聚合后数据的操作往往比对全量数据更高效。
并行处理: 原生
pandas是单线程的。在单机并行方面,推荐使用Polars(默认多线程),或使用Modin等库作为pandas的并行替代。13. pandas 中 .join() 与 .merge() 方法的区别?
Join: 基于索引连接两个 DataFrame。不过也可通过可选参数
on显式指定基于列进行连接。默认执行左连接。语法为df1.join(df2)。Merge:
merge()更灵活,允许您指定用于连接的列。默认执行内连接,但可自定义为左、右、外、内、交叉等多种连接类型。语法为pd.merge(df1, df2, on=”column_names”)。14. 什么是 Timedelta?
Timedelta 表示一段时间长度,即两个日期或时间之间的差值,单位可为天、小时、分钟和秒。
15. .append() 方法已被移除。现在如何合并 DataFrame?
在现代的 Pandas 环境(2.0 或更高版本)中使用
.append()会报错,因为该方法已被移除,以鼓励更高效的编码实践。取而代之,您应将所有 DataFrame 或行收集到列表中,然后一次性调用
pd.concat():16. 何时应使用 Polars 而不是 pandas?
当出现以下情况时,您应考虑使用
Polars(基于 Rust 的 DataFrame 库):数据集显著大于可用内存:
Polars具备惰性计算/流式处理。需要多线程性能:
pandas的操作大多是单线程的。每毫秒都很重要: 您在构建高性能数据管道。
Pandas 编程面试题
在技术面试中,实践能力与理论知识同等重要。以下是您在上场前需要掌握的一些 pandas 编程类面试题。
17. 如何使用 pandas 读取 Excel 并转为 CSV?
首先用
.read_excel()将 Excel 数据读取到变量中。然后调用.to_csv()即可无缝转换。示例代码如下:
注意: 在现代面试中,可以提及在处理大数据集时,使用 Parquet 格式(用
.to_parquet()代替.to_csv())以保留数据类型,往往更优。18. 如何按列对 DataFrame 排序?
使用
.sort_values()方法可基于单列或多列对 DataFrame 进行排序。语法如下:
df.sort_values(by=[“column_names”]),如下例所示:19. 展示两种不同的数据筛选方法
我们用如下 DataFrame 来演示如何筛选:
方法一:布尔索引
方法二: 使用
.query()方法20. 如何对数据进行聚合(如均值或求和)?
.groupby()可按指定列对数据分组,并对分组数据执行操作。将其与.agg()结合可提升可读性。下面的代码按
Name列分组,并计算每组的Grades平均值:21. 如何基于现有列创建一个新列?
有两种方式可由现有列创建新列:
直接赋值: 为一个新列名赋予对现有列的变换结果:
df['Total'] = df['Math'] + df['Science']方法链: 使用带
.assign()的 lambda 函数:df = df.assign(Total=lambda x: x['Math'] + x['Science'])当下更推荐方法链,因为它通过消除中间变量来提升代码可读性。将整个数据变换组织为单一、连贯的流水线,可显著减少错误,因为您不再有误引用旧版本或错误版本 DataFrame 的风险。
面向数据科学家的 Pandas 面试题
现在我们已覆盖了
pandas的通用与编程面试题,接着看看与数据科学更相关的pandas面试题。22. 如何在 pandas 中处理空值或缺失值?
您可以用以下三种方法之一来处理
pandas中的缺失值:dropna():从 DataFrame 中移除包含缺失值的行或列。fillna():用指定值填充缺失值。interpolate():用插值计算结果填充缺失值。借助 PyArrow 后端,整数列现在可以存储
NA值而无需转为float,这在科研流程中能更好地保持数据保真度。23. fillna() 与 interpolate() 的区别
fillna():用静态值填充(例如 0 或 "Unknown")。在.fillna()中使用method='ffill'进行前向填充已被弃用;请直接使用.ffill()。interpolate():在数据点之间用数学估计(线性、多项式、样条)进行填充。对于希望“连点成线”的时间序列数据尤为重要。24. 什么是重采样(resampling)?
重采样用于改变时间序列数据的报告频率。比如将月度数据转换为周度或年度数据,这就是重采样的用武之地。
将月度数据转换为周度或日度属于上采样,此时会使用插值技术来提升频率。
相对地,将月度转换为年度属于下采样,此时会应用数据聚合技术。
25. 如何在 pandas 中进行独热编码(one-hot encoding)?
我们进行独热编码,是为了将分类值转换为数值,以便输入到机器学习算法中。
在生产环境中,更推荐使用
Scikit-learn的OneHotEncoder,因为它能保留模式(schema)。26. 如何在 pandas 中创建折线图?
要创建折线图,我们使用
pandas的 plot 函数。注意: 现在可以将绘图后端切换为
Plotly以获得交互式图表:pd.options.plotting.backend = "plotly"。27. 获取 DataFrame 各列统计摘要的方法是什么?
df.describe()会返回每列的均值、分位数、最小值、最大值等统计信息。28. 什么是滚动平均(rolling mean)?
滚动平均也称移动平均,其思想是在给定窗口内计算数据点的均值,并在数据上滑动该窗口。它能平滑波动,突出时间序列中的长期趋势。
语法示例:
df['column_name'].rolling(window=n).mean()29. 什么是 SettingWithCopyWarning,如何修复?
当
pandas无法确定您是在修改视图还是副本时,会出现该警告。在现代pandas(3.0+ 场景)中,写时复制(CoW)为默认行为。CoW 严格区分视图与副本,确保对子集的修改不会在未明确要求的情况下悄然改变原始数据。这在很大程度上消除了导致该警告的歧义。在较早版本的
pandas中,修复方法是使用.loc[]进行显式索引,或在修改前将切片赋给新变量,从而保证清晰性并避免意外行为。更多内容见此博文:How to Fix SettingWithCopyWarning。30. 如何在生产环境中验证 DataFrame 的 schema?
行业标准是使用
pandera,这是一个在运行时实施严格数据质量检查的库。pandera允许您定义 schema,以验证列数据类型并应用统计逻辑,例如确保数值处于特定范围内或某列值唯一。您可以使用其装饰器(例如
@pa.check_types)自动验证函数的输入与输出,防止“脏数据”悄然破坏下游流程。这相当于为数据本身进行单元测试。面试准备
很可能会被问到几道最常见的面试题,因此用它们来准备是个好主意。除 pandas 外,数据相关岗位还需要很多其他技能。以下是帮助您在整个面试流程中脱颖而出的清单:
理解岗位要求
回顾职位描述与职责,确保您的技能与简历与之匹配。此外,了解公司以及您的岗位如何产生影响也会加分。
Python 编程
面试官通常会先考察您的 Python 能力,然后才会问其库(pandas)。因此要扎实掌握 Python 基础。
对分析师岗位,Python 本身通常已足够。但如果您申请数据科学家或 ML 工程师岗位,练习 Python 编程题 至关重要。
数据项目
请确保您的简历中包含一些真实世界数据问题的解决案例。有经验者可讲述以往项目;如果您是新手,可以尝试完成一些 Kaggle 项目。
进阶概念
在基础之外,后续的问题取决于具体岗位。
对分析师而言,可能会涉及 Excel、数据可视化仪表板、统计与概率相关问题。
此外,如果您申请数据科学家或 ML 工程师岗位,面试官可能会深入考察机器学习与深度学习相关主题。
若您申请的是技术性很强或资深岗位,可能会遇到系统设计相关问题。请回顾常见设计题,并练习端到端的 ML 系统设计问题。
结语
拿到数据行业的工作往往需要过硬的 Pandas 技能。以上这份既涵盖理论又包含实操的面试题清单,应该能帮助您在 Pandas 部分稳稳拿分。此外,文末的建议也能帮助您整体面试过程更顺利。
以下资源可助您备战 pandas 面试: