python模块之pandas
python模块之pandas
Pandas 是 Python 生态中用于数据处理和分析的核心库,它提供了高效、灵活的数据结构(如 DataFrame 和 Series)和丰富的函数,能够轻松应对从数据加载、清洗、转换到分析的全流程任务。
- 可以加载二维表格,适合分析excel、sql表(DataFrame)。
- 可以处理一维数组,二维由多个一维组成(Series)。
- 基于numpy构建,底层用C,处理百万级数据时,效率远高于纯python
- 灵活读取和存储为csv、excel、sql等文件。
- 缺失、重复值处理,数据类型转换、数据筛选。
- 数据转换与特征工程
- 新增列、删除列、重命名
- 字符串处理str.
- 分组和聚合groupby()
- 基础数据分析和统计describe、corr、rolling
- 很好的兼容性
- 与numpy兼容DataFrame
- 处理后的数据可直接传入 Matplotlib、Seaborn 绘制图表。
- 清洗后的
DataFrame可转换为模型输入格式(如df.values转为 NumPy 数组),供 Scikit-learn 等库使用。
准备数据
从网上搜集pandas练习的数据集,最常用的就是泰坦尼克的乘客数据。
核心api
注意,对于df对象,其所有方法包括fillna\dropna\drop等都是将处理结果返回,默认不会对原df进行改动,但是加上inplace=True参数会对原df做改动。
而有些操作是会对原df直接进行改动,如df["列名"]=某序列(会直接增加或修改该列)
DataFrame 的创建
DataFrame 是一个二维表格结构,类似 Excel 表格或 SQL 表,可通过多种方式创建:
1. 从字典创建(最常用)
字典的键作为列名,值(列表或数组)作为列数据:
import pandas as pd
data = {
'姓名': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'city': ['New York', 'London', 'Paris']
}
df = pd.DataFrame(data)
print(df)
2. 从列表创建
需要指定列名:
data = [
['Alice', 25, 'New York'],
['Bob', 30, 'London'],
['Charlie', 35, 'Paris']
]
df = pd.DataFrame(data, columns=['name', 'age', 'city'])
3. 从文件创建(实际应用最频繁)
# 从 CSV文件创建
df = pd.read_csv('taitannic.csv')
# 从Excel文件创建
df = pd.read_excel('data.xlsx')
数据查看:head()/info()/describe()
这些方法用于快速了解数据的基本情况:
1. head(n):查看前 n 行(默认前 5 行)
df.head() # 前5行
df.head(3) # 前3行
2. info():查看数据概览(数据类型、缺失值等)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 13 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 891 non-null int64
1 Survived 891 non-null int64
2 Pclass 891 non-null int64
3 Name 891 non-null object
4 Sex 891 non-null object
5 Age 714 non-null float64
6 SibSp 891 non-null int64
7 Parch 891 non-null int64
8 Ticket 891 non-null object
9 Fare 891 non-null float64
10 Cabin 204 non-null object
11 Embarked 889 non-null object
12 AgeIsNull 891 non-null bool
dtypes: bool(1), float64(2), int64(5), object(5)
memory usage: 84.5+ KB
# 输出包含:行数、列数、各列数据类型、非空值数量等,以及数据占内存情况
3. describe():查看数值型列的统计信息
df.describe()
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
# 输出包含:计数、均值、标准差、最小值、分位数、最大值等
缺失值处理(dropna()/fillna())
查看缺失值
先确认缺失值的位置和数量:
# 查看每列缺失值数量
print("\n缺失值数量:")
print(df.isnull().sum())
# 查看包含缺失值的行
print("\n包含缺失值的行:")
print(df[df.isnull().any(axis=1)]) #axis代表方向为列,很多pandas函数中有此参数
dropna():删除缺失值
# 练习1:删除所有包含缺失值的行(默认行为)
df_drop1 = df.dropna()
print("\n删除所有含缺失值的行:")
print(df_drop1)
# 练习2:只删除全为缺失值的行
df_drop2 = df.dropna(how='all')
print("\n只删除全为缺失值的行:")
print(df_drop2)
# 练习3:保留至少有3个非缺失值的行
df_drop3 = df.dropna(thresh=3)
print("\n保留至少3个非缺失值的行:")
print(df_drop3)
# 练习4:只删除指定列(如'age')有缺失值的行
df_drop4 = df.dropna(subset=['age'])
print("\n删除'age'列有缺失值的行:")
print(df_drop4)
fillna():填充缺失值
# 练习1:用固定值填充所有缺失值
df_fill1 = df.fillna(0)
print("\n用0填充所有缺失值:")
print(df_fill1)
# 练习2:按列填充(不同列用不同值)
df_fill2 = df.fillna({
'id': df['id'].mode()[0], # 用众数填充id
'name': 'Unknown', # 用'Unknown'填充name
'age': df['age'].astype(float).mean(), # 用均值填充age(需先转换为数值型)
'score': df['score'].median() # 用中位数填充score
})
print("\n按列自定义填充缺失值:")
print(df_fill2)
# 练习3:用前一行的值填充(向前填充)
df_fill3 = df.fillna(method='ffill')
print("\n向前填充缺失值:")
print(df_fill3)
# 练习4:用后一行的值填充(向后填充)
df_fill4 = df.fillna(method='bfill', limit=1) # 限制最多填充1次
print("\n向后填充缺失值(限制1次):")
print(df_fill4)
重复值处理(drop_duplicates())
查看重复值
print(df[df.duplicated()])
print(df[df.duplicated(subset=['name', 'score'])])
drop_duplicates():删除重复值
# 练习1:删除完全重复的行(默认保留第一行)
df_dup1 = df.drop_duplicates()
print("\n删除完全重复的行:")
print(df_dup1)
# 练习2:按指定列(如'id')删除重复值,保留最后出现的行
df_dup2 = df.drop_duplicates(subset=['id'], keep='last')
print("\n按'id'删除重复值(保留最后一行):")
print(df_dup2)
# 练习3:删除重复值后直接在原DataFrame上修改(inplace=True)
df_copy = df.copy() # 复制一份避免修改原始数据
df_copy.drop_duplicates(subset=['name'], keep=False, inplace=True) # 只保留不重复的name
print("\n只保留不重复的'name':")
print(df_copy)
条件筛选(df[df.列名>阈值])
条件筛选用于按指定规则提取数据,支持单条件、多条件组合等。
多条件组合(& 且 / | 或 / ~ 非)
# 示例:筛选出年龄<18岁的男性,或年龄>60岁的女性
condition = ((df['Age'] < 18) & (df['Sex'] == 'male')) | ((df['Age'] > 60) & (df['Sex'] == 'female'))
special_group = df[condition]
print("\n特殊群体(少年男性或老年女性):")
print(special_group[['Name', 'Age', 'Sex']].head())
用 isin() 筛选包含特定值的行
# 示例:筛选出舱位等级(Pclass)为1或2的乘客
first_or_second = df[df['Pclass'].isin([1, 2])]
print("\n1等或2等舱乘客:")
print(first_or_second[['Name', 'Pclass']].head())
列操作(rename()/drop()/ 新增列)
重命名列(rename())
# 方法1:用字典重命名指定列
df_renamed = df.rename(columns={
'Pclass': 'CabinClass', # 舱位等级重命名
'Survived': 'IsSurvived' # 是否存活重命名
})
print("\n重命名后的列名:", df_renamed.columns.tolist())
# 方法2:直接修改 columns 属性(适合批量重命名)
df_copy = df.copy()
df_copy.columns = [col.lower() for col in df_copy.columns] # 所有列名改为小写
print("小写列名:", df_copy.columns.tolist())
删除列(drop())
# 方法1:删除指定列(通过列名)
df_drop1 = df.drop(columns=['Ticket', 'Fare']) # 删除票号和票价列
print("\n删除'Ticket'和'Fare'后保留的列:", df_drop1.columns.tolist())
# 方法2:通过索引删除列(axis=1 表示列)
df_drop2 = df.drop(df.columns[[6, 7]], axis=1) # 删除第6和第7列(索引从0开始)
print("通过索引删除列后保留的列:", df_drop2.columns.tolist())
新增列
# 示例1:基于现有列计算新增列(家庭总人数=同行父母子女数+同行兄弟姐妹数+1)
df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
print("\n新增家庭总人数列:")
print(df[['Name', 'SibSp', 'Parch', 'FamilySize']].head())
# 示例2:根据条件新增分类列(年龄分组)
df['AgeGroup'] = pd.cut(
df['Age'],
bins=[0, 12, 18, 60, 100],
labels=['儿童', '青少年', '成人', '老年']
)
print("\n新增年龄分组列:")
print(df[['Name', 'Age', 'AgeGroup']].head())
字符串处理(str.contains())
Pandas 的 str 访问器提供了丰富的字符串处理方法,str.contains() 用于判断字符串是否包含特定子串。
# 示例1:筛选出姓名中包含"Mr."的男性乘客(通常为已婚男性)
mr_passengers = df[df['Name'].str.contains('Mr.', na=False)] # na=False 表示缺失值视为不包含
print("\n姓名含'Mr.'的乘客:")
print(mr_passengers[['Name', 'Sex']].head())
# 示例2:筛选出从南安普顿(Southampton,出发港口代码'S')出发的乘客
southampton = df[df['Embarked'].str.contains('S', na=False)]
print("\n从南安普顿出发的乘客数量:", len(southampton))
# 示例3:结合其他字符串方法(提取姓名中的头衔)
df['Title'] = df['Name'].str.extract(' ([A-Za-z]+)\.', expand=False) # 提取头衔(如Mr、Mrs)
print("\n提取的头衔列:")
print(df[['Name', 'Title']].head())
str.lower()/str.upper():转换大小写str.strip():去除首尾空格str.replace():替换子串str.split():分割字符串
练习
- 删除完全重复的用户;
- 用均值填充年龄缺失值,并转换为整数;
- 用 ' 未填写 ' 填充姓名缺失值;
- 删除分数列全为缺失值的行;
- 最终查看处理后的数据类型和前 5 行。
- 筛选出「1 等舱且存活」的乘客,并查看他们的姓名、年龄和性别。
- 新增一列「AgeIsNull」,标记年龄是否为缺失值(1 = 缺失,0 = 不缺失)。
- 重命名「Cabin」列为「船舱号」,并删除「Embarked」列。
- 筛选出姓名中包含「Miss」且年龄小于 20 岁的女性乘客。

浙公网安备 33010602011771号