跳至主要内容

Pandas 面试题与答案 Top 30

探索数据科学岗位常见的 Pandas 面试题及答案。
Srujana Maddula
Srujana Maddula

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

在本文中,我整理了最常被问到的 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 会打印 DataFrame df 当前的行索引。

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 就能修正这一问题。

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)

8. loc 与 iloc 有何区别?

在 pandas 中,.loc() 和 .iloc() 都用于选择 DataFrame 的子集。实际工作中,它们广泛用于按条件筛选 DataFrame。

当使用行列的实际标签来选择数据时,应使用 .loc();而基于行列的整数位置来提取数据时,使用 .iloc()。

9. 展示两种创建 pandas DataFrame 的方法

从字典:

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()

如果您希望查看百分比分布而非原始计数,可在 .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():

new_df = pd.concat([df1, df2], ignore_index=True)

16. 何时应使用 Polars 而不是 pandas?

当出现以下情况时,您应考虑使用 Polars(基于 Rust 的 DataFrame 库):

  • 数据集显著大于可用内存: Polars 具备惰性计算/流式处理。

  • 需要多线程性能: pandas 的操作大多是单线程的。

  • 每毫秒都很重要: 您在构建高性能数据管道。

Pandas 编程面试题

在技术面试中,实践能力与理论知识同等重要。以下是您在上场前需要掌握的一些 pandas 编程类面试题。

17. 如何使用 pandas 读取 Excel 并转为 CSV?

首先用 .read_excel() 将 Excel 数据读取到变量中。然后调用 .to_csv() 即可无缝转换。

示例代码如下:

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) 

注意: 在现代面试中,可以提及在处理大数据集时,使用 Parquet 格式(用 .to_parquet() 代替 .to_csv())以保留数据类型,往往更优。

18. 如何按列对 DataFrame 排序?

使用 .sort_values() 方法可基于单列或多列对 DataFrame 进行排序。

语法如下:df.sort_values(by=[“column_names”]),如下例所示:

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)

方法一:布尔索引

new_df = df[(df.Name == "John") | (df.Marks > 90)]
print (new_df)

方法二: 使用 .query() 方法

df.query('Name == "John" or Marks > 90')
print (new_df)

20. 如何对数据进行聚合(如均值或求和)?

.groupby() 可按指定列对数据分组,并对分组数据执行操作。将其与 .agg() 结合可提升可读性。

下面的代码按 Name 列分组,并计算每组的 Grades 平均值:

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 Matt
print(df.groupby('Name').agg(
    avg_grade=('Grades', 'mean'),
)

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)?

我们进行独热编码,是为了将分类值转换为数值,以便输入到机器学习算法中。

import pandas as pd

data = {'Name': ['John', 'Cateline', 'Matt', 'Oliver'],
        'ID': [1, 22, 23, 36],
        'Category': ['A', 'B', 'A', 'B']}

df = pd.DataFrame(data)

#one hot encoding 
new_df = pd.get_dummies(df, columns=['Category'])
new_df.head()

在生产环境中,更推荐使用 Scikit-learn 的 OneHotEncoder,因为它能保留模式(schema)。

26. 如何在 pandas 中创建折线图?

要创建折线图,我们使用 pandas 的 plot 函数。

import pandas as pd


data = {'units': [1, 2, 3, 4, 5],
        'price': [7, 12, 8, 13, 16]}
# Create a DataFrame df
df = pd.DataFrame(data)

df.plot(kind='line', x='units', y='price')

注意: 现在可以将绘图后端切换为 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 面试:

Srujana Maddula

作者

Srujana Maddula

Srujana 是一名自由职业技术写作者,拥有计算机科学四年制学位。她擅长撰写各类主题的内容,包括数据科学、云计算、开发、编程、安全等众多领域。她热爱经典文学,也喜欢探索新的旅行目的地。

主题