本文标题:practical1作业和知识点

本文链接:http://7r4ck3r.top/index.php/archives/31/

除非另有说明,本作品遵循CC 4.0 BY-SA 版权协议

声明:转载请注明文章来源。

作业

文件在我的github上,链接是 (https://github.com/7r4ck3r/7r4ck3r.github.io)
也可以在博客左下角的按钮处可以直接到达
屏幕截图 2024-10-25 125034.png

代码分析

不复制全部代码了,重点是看一下一些代码的意思

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 类型是一种用于处理有限分类数据的特殊数据类型。它在表示具有一组固定类别的数据时非常高效,适用于分组分析、分层汇总等操作。

  1. 基本特点
    分类值:category 类型包含一个唯一的、预定义的值集合,这些值被称为类别(或称类别标签)。每个值都属于其中的一个类别。
    存储优化:将数据转换为 category 类型后,pandas 会为每个类别分配一个整数编码,从而节省存储空间,尤其是对具有大量重复值的列来说。
    加速操作:由于类别类型采用整数编码,分组、排序等操作的速度会加快。
  2. 适用场景
    重复数据:包含大量重复的分类数据时,比如性别、等级、地区等。
    离散类别:数据属于一组有限的类别,并且该集合在分析时不会发生变化(例如,星期几、国家名称等)。
    分层分组操作:category 类型在执行分组和分层统计分析时性能更好。
  3. 如何创建 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')
  4. 类别顺序
    可以给类别数据设置顺序(有序类别),这对于需要按特定顺序排列的分类数据(如低、中、高)非常有用:

    # 定义带有顺序的 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
最后修改:2024 年 10 月 28 日
如果觉得我的文章对你有用,请随意赞赏