
数据分析岗的面试题有一个特点:函数名谁都能背,但能把手里的脏数据收拾明白的才是分水岭。面试官不考你背了多少 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教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14638/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料