编程学习网 > 编程语言 > Python > Python 数据分析面试:会 groupby 和 fillna,就能过一半!
2026
10-28

Python 数据分析面试:会 groupby 和 fillna,就能过一半!


数据分析岗的面试题有一个特点:函数名谁都能背,但能把手里的脏数据收拾明白的才是分水岭。面试官不考你背了多少 API,考的是拿到一份真实数据时你的第一反应和处理思路。下面 8 题,是数据岗面试出现率最高的考点。 

一、怎么统计一组数据的出现频率,取前几名?

python

from collections import Counter

words = ["py", "go", "py", "java", "py", "go"]

Counter(words).most_common(2)   # [('py', 3), ('go', 2)]

答案:Counter + most_common 一行搞定。手写字典也能做,但没必要。

为什么这么考:高频题,考你对 collections 熟不熟。面试官常追问:most_common() 不传参时按什么排?——按数量降序,数量相同的按首次出现顺序。日志里的高频词、接口调用频次排行,都是这一行。

二、一列数字,怎么快速求均值、中位数、标准差?

python

import statistics

nums = [85, 90, 78, 92, 88]

statistics.mean(nums)     # 均值 86.6

statistics.median(nums)   # 中位数 88

statistics.stdev(nums)    # 样本标准差

答案:statistics 标准库直接算。注意 stdev 是样本标准差(分母 n-1),要总体标准差用 pstdev。数据量大、要向量化,就上 numpy / pandas。

为什么这么考:送分题,看你会不会区分样本和总体统计量。追问点:median 在偶数个数据时怎么算?——取中间两个的平均。真要按组批量算,直接用 pandas 的 describe() 或 groupby 更省事。

三、pandas 怎么读 CSV、怎么快速摸清数据?

python

import pandas as pd

df = pd.read_csv("sales.csv")

df.head()        # 前 5 行

df.info()        # 列名、类型、非空数量

df.describe()    # 数值列的统计摘要

答案:read_csv 读进来,head / info / describe 三件套快速摸清数据长什么样。

为什么这么考:考你拿到陌生 CSV 的第一反应。追问点:info() 能看出什么?——列名、dtype、每列非空数量;describe() 默认只看数值列,想看分类列加 include="object"。常见的坑是 id、日期被读成 int / object,读的时候用 dtype 或 parse_dates 指一下。

四、按某一列分组,对其他列求和,怎么写?

python

df.groupby("region")["amount"].sum()     # 按地区汇总销售额

df.groupby("region")["amount"].mean()    # 按地区求平均

答案:df.groupby("region")["amount"].sum()。这是数据分析面试里出现率最高的一行,建议背下来。

为什么这么考:groupby 是数据岗第一考点。面试官常追问三连:想同时算多个聚合怎么写?——agg(["sum", "mean"]);分组结果想变回 DataFrame?——reset_index(),或建组时直接 as_index=False;怎么取每组前几名?——先 sort_values() 再 groupby(...).head(n)。按地区、按渠道汇总销售额,真实业务里就是这么一句。

五、数据里有缺失值,怎么处理?

python

df.dropna()    # 删掉有缺失的行

df.fillna(0)   # 缺失填 0

df["score"].fillna(df["score"].mean())   # 数值列填均值

答案:缺行用 dropna,缺值用 fillna(填 0、均值或中位数)。先看缺失比例,再决定删还是填。

为什么这么考:真实数据几乎必有缺失,这题接近必考。追问点:怎么先摸清缺失情况?——df.isna().sum() 看每列缺多少,df.isna().mean() 看缺失比例。比例低就 dropna(subset=[...]) 只删关键列,数值列填值时用中位数比均值更抗离群点。要顺着往前填,fillna 还能传 method="ffill"。注意 dropna() 默认删掉含任一缺失的行,只想删全空的加 how="all"。

六、numpy 数组和 Python 列表,运算上最大区别?

python

import numpy as np

a = np.array([1, 2, 3])

a * 2 + 1        # [3, 5, 7]  向量化,不用写循环

[1, 2, 3] * 2    # [1, 2, 3, 1, 2, 3]  列表 * 是复制元素

答案:numpy 支持向量化运算,对整个数组一次算完,快且简洁;列表的 * 只是把元素复制 n 遍,不会逐元素相乘。

为什么这么考:考你有没有真拿 numpy 跑过数据。追问点:两个等长数组做 a * b 是什么运算?——逐元素相乘,形状不一致时靠广播自动对齐。特征工程、归一化这些计算里,numpy 比纯 Python 列表快一个量级不止,底层是 C 实现。

七、两个 DataFrame 怎么纵向拼接 / 按键合并?

python

pd.concat([df1, df2], ignore_index=True)   # 纵向拼接(行)

pd.merge(df1, df2, on="user_id")           # 按列合并(join)

答案:concat 拼行,merge 按键 join。别两个都拿 concat 硬套。

为什么这么考:考你分不分得清两类拼接。追问点:merge 默认是 inner join,要保留左边全部行加 how="left";两边键名不同用 left_on / right_on;concat 默认按行拼(axis=0),要拼列改 axis=1。月底把几张分表合成一张、把用户表和订单表按 id 对起来,就这两行。

八、一个 10GB 的大 CSV,怎么读才不爆内存?

python

# 分块读

for chunk in pd.read_csv("big.csv", chunksize=100_000):

    process(chunk)

 

# 或只读需要的几列

pd.read_csv("big.csv", usecols=["id", "amount"])

答案:用 chunksize 分块处理,或用 usecols 只读需要的列,必要时用生成器逐行读。

为什么这么考:这是"纸上谈兵"检测器——没处理过大数据的人,只会来一句"用 pandas 读"。追问点:chunksize 返回什么?——一个迭代器,每次吐一块 DataFrame,在循环里逐块处理再汇总;usecols 只载入用得到的列,省内存立竿见影;量再大就该考虑 Dask 这类并行框架,或把数据落到数据库里按需取数。

以上就是“Python 数据分析面试:会 groupby 和 fillna,就能过一半!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。  

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取