Python数据分析实战:用Pandas处理泰坦尼克号获救数据
准备工作
在开始数据分析前,需导入Pandas和NumPy库并设置别名(行业通用规范,简化代码书写):
import pandas as pd # 数据处理核心库,别名为pd
import numpy as np # 数值计算库,别名为np
一、数据读取
使用pd.read_csv()读取泰坦尼克号数据集,通过head()查看前5行数据(快速了解数据结构):
# 读取泰坦尼克号船员获救数据
titanic_survival = pd.read_csv("titanic_train.csv")
titanic_survival.head() # 无参数默认返回前5行,可通过head(n)指定返回行数
运行结果说明
返回数据包含乘客ID、存活状态、船舱等级、姓名、性别、年龄等核心字段,为后续分析奠定基础。
二、缺失值处理(核心重点)
数据中的缺失值(标记为NaN)会影响分析结果准确性,需优先处理。以下以「Age(年龄)」字段为例,演示完整处理流程:
1. 检测缺失值:isnull()
isnull()函数可判断每个值是否为缺失值,返回布尔值(True=缺失,False=非缺失):
# 提取Age列数据
age = titanic_survival["Age"]
print("Age列前11行数据:")
print(age.loc[0:10]) # 查看0-10行数据# 检测缺失值
age_is_null = pd.isnull(age)
print("\n缺失值检测结果(True=缺失):")
print(age_is_null)# 筛选缺失值并统计个数
age_null_true = age[age_is_null] # 保留缺失值
age_null_count = len(age_null_true) # 统计缺失值数量
print(f"\nAge属性缺失值的个数:{age_null_count}")
2. 缺失值的影响与解决方法
2.1 未处理缺失值的后果
直接对含缺失值的字段计算平均值,结果会返回NaN(无法得到有效结果):
# 错误示例:未处理缺失值计算平均年龄
mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"])
print("未处理缺失值的平均年龄:", mean_age) # 输出:NaN
2.2 三种有效解决方法
方法1:过滤缺失值(直接剔除)
筛选出非缺失值后再计算,适用于缺失值占比极低的场景:
# 筛选非缺失值(age_is_null == False)
good_ages = titanic_survival["Age"][age_is_null == False]
# 计算正确的平均年龄
correct_mean_age = sum(good_ages) / len(good_ages)
print("过滤缺失值后的平均年龄:", correct_mean_age)
方法2:使用mean()自动处理(推荐)
Pandas的mean()函数会自动忽略缺失值,简洁高效:
# 直接用Pandas内置mean()函数计算平均年龄
correct_mean_age = titanic_survival["Age"].mean()
print("用mean()得到的平均年龄:", correct_mean_age)
方法3:填充缺失值(更优方案)
直接过滤缺失值会丢失数据,推荐用平均值、中位数或众数填充(保留更多数据):
# 用平均年龄填充缺失值
age_filled = titanic_survival["Age"].fillna(titanic_survival["Age"].mean())
print("填充缺失值后的前11行数据:")
print(age_filled.loc[0:10])
⚠️ 重点注意:过滤缺失值仅适用于缺失率<5%的场景,否则会导致数据偏差;填充缺失值(均值/中位数/众数)是更常用的方案,能最大程度保留数据完整性。
三、数据统计分析(实战场景)
1. 按船舱等级统计平均票价
方法1:for循环实现(基础思路)
# 定义船舱等级列表
passenger_classes = [1, 2, 3]
# 字典存储结果(key=船舱等级,value=平均票价)
fares_by_class = {}for this_class in passenger_classes:# 筛选当前船舱等级的所有数据pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class]# 提取票价列并计算平均值pclass_fares = pclass_rows["Fare"].mean()# 存入字典fares_by_class[this_class] = pclass_faresprint("每类船舱对应的平均票价(for循环):", fares_by_class)
方法2:pivot_table()数据透视表(推荐)
pivot_table()是Pandas核心统计函数,可快速实现「分组统计」,参数说明:
index:分组基准(如船舱等级Pclass)values:统计字段(如票价Fare)aggfunc:统计方式(如均值np.mean、求和np.sum,默认均值)
# 用数据透视表统计船舱等级与平均票价的关系
fares_by_class = titanic_survival.pivot_table(index="Pclass", # 按船舱等级分组values="Fare", # 统计票价aggfunc=np.mean # 统计方式:均值
)
print("每类船舱对应的平均票价(pivot_table):")
print(fares_by_class)
2. 拓展统计场景
场景1:统计每类船舱的平均存活率
# 船舱等级与平均存活率的关系
survival_by_class = titanic_survival.pivot_table(index="Pclass",values="Survived", # 统计存活状态(1=存活,0=死亡)aggfunc=np.mean
)
print("每类船舱对应的平均存活率:")
print(survival_by_class)
场景2:统计每类船舱的平均年龄
age_by_class = titanic_survival.pivot_table(index="Pclass",values="Age",aggfunc=np.mean
)
print("每类船舱对应的平均年龄:")
print(age_by_class)
场景3:多字段统计(登船地点的总票价与获救人数)
# 按登船地点分组,统计总票价和总获救人数
port_stats = titanic_survival.pivot_table(index="Embarked", # 按登船地点分组(C/Q/S)values=["Fare", "Survived"], # 同时统计两个字段aggfunc=np.sum # 统计方式:求和
)
print("不同登船地点的总票价与总获救人数:")
print(port_stats)
四、数据清洗与筛选
1. 剔除缺失值:dropna()
dropna()可删除含缺失值的行/列,参数说明:
axis=0:删除行(默认),axis=1:删除列subset:指定检测缺失值的字段(仅当这些字段缺失时才删除)
# 查看原始数据前7行
print("删除缺失值前(前7行):")
print(titanic_survival.head(7))# 删除Age或Sex字段含缺失值的行
new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age", "Sex"] # 仅检测这两列的缺失值
)# 查看处理后的数据前7行
print("\n删除缺失值后(前7行):")
print(new_titanic_survival.head(7))
2. 精准定位数据:loc[]
loc[]通过「行号+列名」精准获取某个位置的数据(行列索引组合):
# 获取第83行的Age值(行号从0开始)
row_index_83_age = titanic_survival.loc[83, "Age"]
# 获取第766行的Pclass值
row_index_766_pclass = titanic_survival.loc[766, "Pclass"]print(f"第83行的Age:{row_index_83_age}")
print(f"第766行的Pclass:{row_index_766_pclass}")
五、数据排序与索引重置
1. 排序:sort_values()
按指定字段排序,参数ascending=True(升序,默认),ascending=False(降序):
# 按Age字段降序排序(从大到小)
new_titanic_survival = titanic_survival.sort_values("Age", ascending=False)
print("按年龄降序排序后(前10行):")
print(new_titanic_survival.head(10))
2. 重置索引:reset_index()
排序后行号仍为原始索引,用reset_index()重置为连续索引(drop=True删除原始索引):
# 重置索引(drop=True避免保留原始索引)
titanic_reindexed = new_titanic_survival.reset_index(drop=True)
print("\n重置索引后(前10行):")
print(titanic_reindexed.head(10))
六、自定义函数:apply()的灵活运用
apply()可将自定义函数应用到DataFrame的行或列,解决Pandas内置函数无法覆盖的场景,参数axis=1表示按行应用,axis=0(默认)按列应用。
场景1:获取第100行数据(按列应用)
# 定义函数:返回每列的第99行数据(第100行,索引从0开始)
def hundredth_row(column):return column.loc[99]# 按列应用函数,获取第100行所有字段数据
hundredth_row_data = titanic_survival.apply(hundredth_row)
print("第100行数据:")
print(hundredth_row_data)
场景2:统计所有字段的缺失值个数(按列应用)
# 定义函数:统计某列的缺失值个数
def isnull_count(column):column_null = pd.isnull(column)return len(column[column_null])# 统计所有字段的缺失值个数
all_null_count = titanic_survival.apply(isnull_count)
print("\n所有字段的缺失值个数:")
print(all_null_count)
场景3:船舱等级文本化(按行应用)
将数字型船舱等级(1/2/3)转换为文本描述:
# 定义函数:按行转换船舱等级
def which_class(row):pclass = row["Pclass"]if pd.isnull(pclass):return "Unknown"elif pclass == 1:return "First Class"elif pclass == 2:return "Second Class"elif pclass == 3:return "Third Class"# 按行应用函数(axis=1)
classes_text = titanic_survival.apply(which_class, axis=1)
print("\n文本化后的船舱等级(前10行):")
print(classes_text.head(10))
场景4:年龄离散化(按行应用)
将连续型年龄转换为离散标签(未成年/成年):
# 定义函数:按年龄划分标签
def generate_age_label(row):age = row["Age"]if pd.isnull(age):return "Unknown"elif age < 18:return "Minor" # 未成年else:return "Adult" # 成年# 按行应用函数,添加年龄标签列
titanic_survival["age_labels"] = titanic_survival.apply(generate_age_label, axis=1)
print("\n年龄标签(前10行):")
print(titanic_survival[["Age", "age_labels"]].head(10))
拓展:统计不同年龄组的存活率
结合pivot_table()和自定义标签,分析年龄与存活率的关系:
# 统计不同年龄组的平均存活率
age_group_survival = titanic_survival.pivot_table(index="age_labels",values="Survived",aggfunc=np.mean
)
print("\n不同年龄组的存活率:")
print(age_group_survival)
核心函数总结(高亮重点)
| 函数名 | 功能描述 | 核心参数/注意事项 |
|---|---|---|
pd.read_csv() |
读取CSV数据 | 需指定文件路径,支持encoding参数处理编码 |
isnull() |
检测缺失值 | 返回布尔值,常与筛选结合使用 |
mean() |
计算均值 | 自动忽略缺失值,无需手动处理 |
pivot_table() |
数据透视表(分组统计) | index(分组)、values(统计字段)、aggfunc(统计方式) |
dropna() |
删除缺失值 | axis(行/列)、subset(指定字段) |
loc[] |
按索引定位数据 | 格式:loc[行索引, 列名] |
sort_values() |
按字段排序 | ascending(升序/降序) |
reset_index() |
重置索引 | drop=True删除原始索引 |
apply() |
应用自定义函数 | axis(行/列应用),支持复杂逻辑实现 |
通过以上步骤,可完成泰坦尼克号数据的从读取、清洗、统计到自定义分析的全流程,掌握Pandas在实际数据分析中的核心应用。建议结合数据集实操,加深对函数参数和场景适配的理解!
参考博客:
https://www.cnblogs.com/qtww56/p/8728851.html