一、关键函数与概念详解
1. pd.read_csv()
:读取 CSV 文件
pd.read_csv(filename, sep=',', dtype=object)
- 功能:从 CSV 文件加载数据为
DataFrame
。 - 参数说明:
filename
:文件路径sep
:分隔符,默认是逗号,
dtype=object
:强制所有列的数据类型为object
(通常用于字符串或混合类型),避免pandas
自动推断类型导致的问题(如将 ID 误识别为数字)。
✅ 示例:
df = pd.read_csv('data.csv', sep=',', dtype=object)
2. .head(n)
:查看前 n 行数据
df.head(6)
- 返回
DataFrame
的前n
行(默认n=5
)。 - 用于快速检查数据内容、结构和格式。
3. .shape
:获取数据集大小
df.shape
- 返回一个元组
(行数, 列数)
。 - 是了解数据集“体量”的最基本方法。
✅ 示例:
rows, cols = df.shape
print(f"数据集有 {rows} 行,{cols} 列")
4. .iloc[]
:基于位置的索引(Integer-location based indexing)
.iloc
是 pandas
中最安全、最推荐的按位置访问数据的方式。
用法 | 说明 |
---|---|
df.iloc[10] |
获取第 11 行(索引从 0 开始) |
df.iloc[10:21] |
获取第 11 到 21 行(左闭右开,包含 11,不包含 21) |
df.iloc[:, 2] |
获取第 3 列(所有行) |
df.iloc[10, 3] |
获取第 11 行第 4 列的单个值 |
📌 核心规则:
- 索引从 0 开始:第 1 行 → 索引
0
,第 11 行 → 索引10
- 切片左闭右开:
[start:end)
,end
不包含在内
5. 列选择:df['column_name']
df['Language']
- 返回指定列的一维数据结构(
Series
)。 - 可以与
.iloc
结合使用:df.iloc[10:21]['Language']
二、题目解析与正确代码
DA1 用pandas查看牛客网用户数据
描述
输出 Nowcoder.csv
数据集的前 6 行数据。
输入描述
数据集直接从当前目录下的 Nowcoder.csv
文件中读取。
输出描述
输出该数据集的前 6 行。
正确代码
import pandas as pd
n = pd.read_csv('Nowcoder.csv', sep=',', dtype=object)
print(n.head(6))
DA2 牛客网用户数据集的大小
描述
获取 Nowcoder.csv
数据集的行数与列数。
输入描述
数据集直接从当前目录下的 Nowcoder.csv
文件中读取。
输出描述
输出该数据集的行数与列数。
正确代码
import pandas as pd
n = pd.read_csv('Nowcoder.csv', sep=',', dtype=object)
print(n.shape)
DA3 牛客网的第11位用户
描述
输出数据集中第 11 行用户的全部信息。
输入描述
数据集直接从当前目录下的 Nowcoder.csv
文件中读取。
输出描述
输出第 11 行的全部信息,每列信息单独成行。
正确代码
import pandas as pd
n = pd.read_csv('Nowcoder.csv', sep=',', dtype=object)
print(n.iloc[10]) # 索引10对应第11行
DA4 统计牛客网部分用户使用语言
描述
输出数据集中第 10 行到第 20 行用户的常用语言。
输入描述
数据集直接从当前目录下的 Nowcoder.csv
文件中读取。
输出描述
输出第 10 行到第 20 行的常用语言,每行数据单独成行。
正确代码
import pandas as pd
n = pd.read_csv('Nowcoder.csv', sep=',', dtype=object)
print(n.iloc[9:20]['Language']) # 第10行索引为9,第20行索引为19,切片[9:20)包含9到19
🔍 注意:
iloc[9:20]
是因为:
- 第 10 行 → 索引
9
- 第 20 行 → 索引
19
- 切片
[9:20)
包含索引9, 10, ..., 19
,正好是第 10 到 20 行。
三、扩展知识与最佳实践
✅ 1. .iloc
vs .loc
索引器 | 基于 | 示例 | 说明 |
---|---|---|---|
.iloc |
位置(整数) | df.iloc[10] |
推荐用于按顺序访问,不依赖索引标签 |
.loc |
标签(Label) | df.loc[10] |
依赖行索引标签。如果索引被重置或修改,行为可能不同 |
💡 除非你明确知道索引标签,否则优先使用
.iloc
。
✅ 2. 处理空值(NaN)
# 检查是否有空值
print(df.isnull().any()) # 每列是否有空值
print(df.isnull().sum()) # 每列空值数量
# 删除空值行
df_clean = df.dropna()
# 填充空值
df_filled = df.fillna('未知')
✅ 3. 数据类型检查与转换
print(df.dtypes) # 查看每列的数据类型
# 转换类型(如将字符串转为数值)
df['Achievement_value'] = pd.to_numeric(df['Achievement_value'], errors='coerce')
✅ 4. 链式操作与性能
# 链式操作是 pandas 的惯用法
result = (df
.iloc[9:20]
.loc[:, 'Language'] # 更明确地选择列
.tolist()) # 转为列表
五、常见错误与调试技巧
错误现象 | 原因 | 解决方法 |
---|---|---|
KeyError |
列名拼写错误或不存在 | 检查 df.columns |
IndexError |
访问的行索引超出范围 | 检查 df.shape |
数据被截断或显示不全 | pandas 默认设置 |
pd.set_option('display.max_rows', None) |
数字 ID 被转成整数 | pandas 自动推断类型 |
使用 dtype=object 或 dtype={'Nowcoder_ID': str} |