作业
文件在我的github上,链接是 (https://github.com/7r4ck3r/7r4ck3r.github.io)
也可以在博客左下角的按钮处可以直接到达
代码分析
不复制全部代码了,重点是看一下一些代码的意思
import pandas as pd
import numpy as np #导入模块
nesarc = pd.read_csv('nesarc.csv', low_memory=False)
#使用 pandas 库的 read_csv() 函数读取文件 nesarc.csv。low_memory=False:设置为 False 的话,pandas 会一次性读取整个文件,避免在读取大型文件时产生的数据类型推断错误,但会消耗更多内存。
print (len(nesarc)) #打印 nesarc 数据框的行数,也就是数据中的记录数。
print (len(nesarc.columns)) #打印列数
#输出 nesarc 数据框的总行数和总列数
nesarc['S2BQ1B1'] = pd.to_numeric(nesarc['S2BQ1B1'],errors='coerce')
#将 nesarc 数据框中 S2BQ1B1 列的数据转换为数值型,
nesarc['S2BQ1B1']:选择 nesarc 数据框中的 S2BQ1B1 列。
pd.to_numeric(nesarc['S2BQ1B1'], errors='coerce')
使用 pandas 的 to_numeric() 函数将该列的数据转换为数值型。如果遇到非数值数据(例如字符或空值),会根据 errors='coerce' 的参数,将这些无法转换的值变为 NaN(缺失值)。转换后,S2BQ1B1 列的数据将全部变为数值型(如整数或浮点数),并且原来非数值的内容会变为缺失值 (NaN)。
c_al_dep = nesarc['S2BQ1B1'].value_counts(sort=False)
p_al_dep = nesarc['S2BQ1B1'].value_counts(sort=False, normalize=True)
#使用 value_counts(sort=False) 计算 S2BQ1B1 列中每个不同值的出现次数(即频数)。
sort=False 参数表示不按频数排序,输出中各值的顺序与原数据的顺序一致。
normalize=True 参数会将输出的频数转换为相对频率(百分比形式),即每个值占总数的比例。
c_beer_status = nesarc['S2AQ5A'].value_counts(dropna=False)
#dropna=False:表示保留缺失值(NaN)并将其计入统计结果。这意味着,如果 S2AQ5A 列中有缺失数据(NaN),也会在统计结果中显示其出现的次数。
nesarc['S2AQ5B'] = nesarc['S2AQ5B'].astype('category')
#nesarc['S2AQ5B'].astype('category'):使用 astype('category') 将 S2AQ5B 列的数据类型更改为 category,适合表示有限的、离散的分类数据
c_al_dep_alt = nesarc.groupby('S2BQ1B1').size()
#使用 groupby('S2BQ1B1') 按 S2BQ1B1 列的值分组,然后使用 size() 计算每个分组的记录数量(即频数)。
p_al_dep_alt = nesarc.groupby('S2BQ1B1').size()*100/len(nesarc)
#先使用 groupby('S2BQ1B1').size() 得到每个分组的频数。
通过乘以 100 并除以 len(nesarc)(总行数)来将频数转换为百分比(相对频率)。
category
在 pandas 中,category 类型是一种用于处理有限分类数据的特殊数据类型。它在表示具有一组固定类别的数据时非常高效,适用于分组分析、分层汇总等操作。
- 基本特点
分类值:category 类型包含一个唯一的、预定义的值集合,这些值被称为类别(或称类别标签)。每个值都属于其中的一个类别。
存储优化:将数据转换为 category 类型后,pandas 会为每个类别分配一个整数编码,从而节省存储空间,尤其是对具有大量重复值的列来说。
加速操作:由于类别类型采用整数编码,分组、排序等操作的速度会加快。 - 适用场景
重复数据:包含大量重复的分类数据时,比如性别、等级、地区等。
离散类别:数据属于一组有限的类别,并且该集合在分析时不会发生变化(例如,星期几、国家名称等)。
分层分组操作:category 类型在执行分组和分层统计分析时性能更好。 如何创建 category 类型
可以直接在创建 DataFrame 时将列指定为 category 类型,或者使用 .astype('category') 转换数据类型如import pandas as pd # 创建包含类别数据的DataFrame data = pd.DataFrame({'Region': ['East', 'West', 'North', 'South', 'East']}) # 将 Region 列转换为 category 类型 data['Region'] = data['Region'].astype('category')
类别顺序
可以给类别数据设置顺序(有序类别),这对于需要按特定顺序排列的分类数据(如低、中、高)非常有用:# 定义带有顺序的 category 类型 data['Region'] = pd.Categorical(data['Region'], categories=['North', 'South', 'East', 'West'], ordered=True)
查看类别:data['Region'].cat.categories 查看是否有顺序:data['Region'].cat.ordered 添加或移除类别:data['Region'].cat.add_categories(['Central']),data['Region'].cat.remove_categories(['North'])
假设有一列“产品类别”,可以转换为 category 类型并直接进行分组统计
import pandas as pd # 创建 DataFrame df = pd.DataFrame({ 'Product': ['A', 'B', 'C', 'A', 'B', 'A', 'C', 'B'], 'Sales': [100, 150, 200, 120, 160, 110, 210, 170] }) # 将 Product 列转换为 category 类型 df['Product'] = df['Product'].astype('category') # 分组统计 grouped_sales = df.groupby('Product')['Sales'].sum() print(grouped_sales) output Product A 330 B 480 C 410 Name: Sales, dtype: int64