总结整理了Pandas的基础语法,直接对应 LeetCode Pandas15 题的考点。
1. 数据结构与概览 (Data Structure & Inspection)
拿到数据的第一步,先看它长什么样。
-
创建 DataFrame
python# 列表套列表创建 df = pd.DataFrame(data=[[1, 'Alice'], [2, 'Bob']], columns=['id', 'name']) -
查看形状 (
shape)python# 返回一个元组 (行数, 列数)。 rows, cols = df.shape -
筛选数据
python# 过滤与选择列 注意这里用了位运算|或者&,因为or和and只是针对单列,pandas里面用的是位运算 # 然后选择列要用[[]] world[world['area'] >= 3000000 | world['population'] >= 25000000][['name', 'population', 'area']] -
预览数据 (
head)pythondf.head(3) # 默认看前 5 行,指定数字看前 N 行。
2. 数据选取 (Selection)
这里是容易混淆的地方,请记住口诀:loc 看标签(名字),iloc 看下标(位置)。
-
loc(Label-based) :根据行/列的名称筛选。-
语法 :
df.loc[行标签, 列标签] -
场景:比如你要选 name 为 'Alice' 的那一行的 'age' 列。
python# 筛选 'student_id' 为 101 的行,仅查看 'name' 列 df.loc[df['student_id'] == 101, 'name'] -
-
iloc(Integer-based) :根据行/列的物理位置索引(从 0 开始)筛选。-
语法 :
df.iloc[行索引, 列索引] -
场景:不管列名叫什么,我只想要第一行、第二列的数据。
pythondf.iloc[0, 1] # 获取第1行、第2列的一个具体数值 df.iloc[:3, :] # 获取前3行,所有列 (等同于 head(3)) -
-
**条件筛选:**condition满足的部分保留原值,剩余部分设置为0
pythoncondition = (employees['employee_id'] % 2 == 1) & (~employees['name'].str.startswith('M')) employees['bonus'] = employees['salary'].where(condition, 0) -
常规条件筛选 (Boolean Indexing)
python# 选出 employee_id 等于 3 的所有列 df[df['employee_id'] == 3]
3. 数据清洗 (Data Cleaning)
数据处理中最繁琐的步骤。
-
删除重复行 (
drop_duplicates)-
关键点解答 :如果
subset=['A', 'B'],逻辑是 AND (且)。 -
解释 :只有当一行数据的 'A' 列 和 'B' 列的值,与另一行完全一致时,才会被视为重复并删除。
python# 只有当 email 和 name 都一样时,才算重复行并删除 # keep='first' 保留第一次出现的,删除后面出现的 df.drop_duplicates(subset=['email', 'name'], keep='first') -
-
处理缺失值 (
dropna/fillna)-
删除 (Drop):
-
关键点解答 :如果
subset=['A', 'B'],逻辑是 OR (或)。 -
如果想实现"全部为空才删除":用how=all
python# 只有当 'name' 和 'email' 同时为缺失值时,才删除这一行 df.dropna(subset=['name', 'email'], how='all') -
填充 (Fill):
python# 把 quantity 列里的 NaN 填补为 0 df.fillna({'quantity': 0})
-
-
修改列属性 (
rename/astype)-
重命名:
python# 把 id 改名为 student_id df.rename(columns={'id': 'student_id'}) -
改类型:
python# 把 grade 列里的字符串转为整数 (例如 "98.0" -> 98) df.astype({'grade': int})
-
4. 数据修改 (Modification)
在表中进行计算或修改内容。c
-
创建/更新列
- 直接赋值即可。如果列名存在则修改,不存在则新建。
python# 新建一个 bonus 列,值是 salary 的两倍 df['bonus'] = df['salary'] * 2
5. 表格重塑 (Reshaping)
这三个函数决定了你能不能把数据变成想要的形状。
-
连接 (merge)
-
功能:合并两个表
-
例子:suffixes代表如果同名,自动加上后缀,how用于表示不同的join
python# 1. 连接 Employee 表和 Department 表 # left_on='departmentId' 对应 Employee 表,right_on='id' 对应 Department 表 df = employee.merge(department, left_on='departmentId', right_on='id', suffixes=('_emp', '_dept'), how = 'inner')
-
-
连结 (
concat)-
功能:像堆积木一样,把两个表拼在一起。默认是上下拼接(增加行数)。
-
例子:
python# 把 df1 和 df2 上下拼成一个大表 pd.concat([df1, df2])
-
-
透视 (
pivot) ------ 长表变宽表-
功能:把某一列里的"值"变成新的"列名"。通常用于看报表。
-
例子:假设你有一张流水账表,想看每个月(index)不同城市(columns)的气温(values)。
python# 结果中:每一行是一个 month,每一列是一个 city,中间填的是 temperature df.pivot(index='month', columns='city', values='temperature')
-
-
融合 (
melt) ------ 宽表变长表-
功能 :
pivot的逆操作。把很多列名"折叠"进一列里。通常用于方便计算机处理数据。 -
例子:把 'Quarter1', 'Quarter2' 这些列名折叠变成一个叫 'quarter' 的新列。
pythonreport = report.melt( # id_vars: 指定需要保留作为标识符的列,这些列不会被"融化" # 在这里'product'列将保持不变,每行数据都会包含产品信息 id_vars = ['product'], # value_vars: 指定需要被"融化"的列,即从列名转换为列值的列 # 这里将四个季度列转换为行数据 value_vars = ["quarter_1", "quarter_2", "quarter_3", "quarter_4"], # var_name: 指定新列的列名,这个列将包含被融化列的原始列名 # 这里新列将命名为"quarter",包含"quarter_1"、"quarter_2"等值 var_name = "quarter", # value_name: 指定新列的列名,这个列将包含被融化列的原始值 # 这里新列将命名为"sales",包含每个季度对应的销售额数据 value_name = "sales" )
-
6. 字符串函数
python
# 长度用.str 再加函数名的方法
return tweets[tweets['content'].str.len() > 15][['tweet_id']]
# startswith
condition = (employees['employee_id'] % 2 == 1) & (~employees['name'].str.startswith('M'))
employees['bonus'] = employees['salary'].where(condition, 0)
# str[0]取出的是一个series,因此还需要.str
users['name'] = users['name'].str[0].str.upper() + users['name'].str[1:].str.lower()
#正则表达式用math函数
pattern = r'^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\.com$'
return users[users['mail'].str.match(pattern)]
# contains用于判断是否包含
return patients[patients['conditions'].str.contains(r'(^|\s)DIAB1')]
7. 其他
-
排序 (rank):method = 'dense'
pythonscores['rank'] = scores['score'].rank(method = 'dense', ascending = False) scores = scores.sort_values('score', ascending = False)[['score', 'rank']] -
方法链 (Method Chaining):因为 Pandas 的大多数函数返回的都是一个新的 DataFrame,所以可以像"接龙"一样一直写下去,不用每次都赋值中间变量。
python
result = (df
.dropna(subset=['id']) # 1. 先删缺失值
.rename(columns={'id': 'key'}) # 2. 再改名
.sort_values('key') # 3. 再排序
) # 一气呵成