Pandas 测验¶
概念与用途¶
本页通过短题检查对象模型、索引、清洗、合并、分组、时间序列和 I/O 理解。先独立作答,再运行练习代码和查看答案。
核心 API 范围¶
Series、DataFrame、loc、iloc、fillna、drop_duplicates、merge、concat、groupby、pivot_table、rolling、read_csv、to_parquet。
题目¶
loc与iloc的切片语义有什么不同?- 为什么两个 Series 相加可能出现
NaN? groupby().agg()与groupby().transform()的输出粒度有什么区别?- 如何检测一次连接是否意外成为多对多连接?
- CSV 与 Parquet 在类型保真和分析性能上有何差异?
- 为什么时间窗口计算前必须排序?
可运行练习¶
import pandas as pd
orders = pd.DataFrame({"customer": ["A", "A", "B"], "amount": [10, None, 30]})
# 练习:按客户中位数填充空值,再添加每笔金额占客户总额的比例。
orders["amount"] = orders["amount"].fillna(
orders.groupby("customer")["amount"].transform("median")
)
orders["share"] = orders["amount"] / orders.groupby("customer")["amount"].transform("sum")
print(orders)
可运行练习二:验证连接粒度¶
import pandas as pd
orders = pd.DataFrame({"order_id": [1, 2], "customer_id": [10, 20]})
customers = pd.DataFrame({"customer_id": [10, 20], "name": ["Ada", "Lin"]})
joined = orders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True)
assert len(joined) == len(orders)
assert joined["_merge"].eq("both").all()
print(joined)
尝试在 customers 中加入重复 customer_id,观察 validate="many_to_one" 如何阻止结果行数膨胀。再加入缺失客户,观察 _merge 的变化。
参考答案与注意事项¶
loc按标签且标签切片通常包含右端;iloc按整数位置且右端不包含。- Series 按索引对齐,任一侧缺少标签时结果为空。
agg每组输出汇总行,transform返回与原组等长结果。- 在
merge使用validate="one_to_one"、one_to_many或many_to_one,并检查行数。 - CSV 是无 schema 文本;Parquet 保存更多类型信息并支持压缩、列裁剪和过滤下推。
- 窗口依赖相邻顺序,未排序会把错误记录纳入窗口。真实工程还要验证空键、重复键、时区、dtype 和结果行数,不能只验证代码能运行。