• Pandas练习


    一 题目要求

    酒类消费数据
    给定一个某段时间内各个国家的酒类消费数据表drinks.csv,其中包含6个字段,表8-1
    给出了该表中的字段信息。

                                            表8-1酒类消费数据表的字段信息

    Country国家
    beer_servings啤酒消费量
    spirit_servings烈酒消费量
    wine_servings红酒消费量
    total_litres_of_pure_alcohol纯酒精消费总量
    Continent所在的大洲

    完成以下的任务:

    1. 用pandas将酒类消费数据表中的数据读取为DataFrame,输出包含缺失值的行;
    2. 在使用read_csv函数读取酒类消费数据表时(除文件地址外不添加额外的参数),pandas将continent字段中的“NA”(代表北美洲,NorthAmerican)自动识别为NaN。因此,需要将continent字段中的NaN全部替换为字符串NA。如果学有余力,可以自行在网络上调研如何在read_csv函数中添加参数使NA不被识别为NaN;
    3. 分别输出各个大洲的平均啤酒、烈酒和红酒的消费量;
    4. 分别输出啤酒、烈酒和红酒消费量最高的国家。

    1 Pandas读取.csv文件

    1. # 使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为
    2. def read_drinks_data():
    3. return pd.read_csv('drinks.csv', keep_default_na=False)
    1. 使用 pd.read_csv('drinks.csv', index_col=False) 读取数据,这可以避免 Pandas 将第一列识别为索引列。
    2. 设置 pd.set_option('display.max_rows', None) 和 pd.set_option('display.max_columns', None) 来显示全部数据。
    3. 如果数据量非常大,您也可以考虑使用 chunksize 参数分块读取数据,或者使用 head() 或 tail() 等方法查看部分数据。

    2 计算最大 max()

    1. def get_max_value_and_country(df, column_name):
    2. max_value = df[column_name].max()
    3. max_row = df[df[column_name] == max_value]
    4. return max_row['country'].values[0], max_value

    3 计算总数 sum()

    1. def print_continent_totals(df_continent):
    2. for name, group in df_continent:
    3. print(name)
    4. print(group['beer_servings'].sum(), group['spirit_servings'].sum(), group['wine_servings'].sum())
    5. print()

    二 完整代码实现

    1. import pandas as pd
    2. # 使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为
    3. def read_drinks_data():
    4. return pd.read_csv('drinks.csv', keep_default_na=False)
    5. # 计算最大
    6. def get_max_value_and_country(df, column_name):
    7. max_value = df[column_name].max()
    8. max_row = df[df[column_name] == max_value]
    9. return max_row['country'].values[0], max_value
    10. # 计算总数
    11. def print_continent_totals(df_continent):
    12. for name, group in df_continent:
    13. print(name)
    14. print(group['beer_servings'].sum(), group['spirit_servings'].sum(), group['wine_servings'].sum())
    15. print()
    16. def main():
    17. data = read_drinks_data()
    18. df = pd.DataFrame(data)
    19. df_continent = df.groupby(df['continent'])
    20. print_continent_totals(df_continent)
    21. max_beer_country, max_beer_servings = get_max_value_and_country(df, 'beer_servings')
    22. print(max_beer_country, max_beer_servings)
    23. max_spirit_country, max_spirit_servings = get_max_value_and_country(df, 'spirit_servings')
    24. print(max_spirit_country, max_spirit_servings)
    25. max_wine_country, max_wine_servings = get_max_value_and_country(df, 'wine_servings')
    26. print(max_wine_country, max_wine_servings)
    27. if __name__ == "__main__":
    28. main()

    三 总结

    Pandas 在读取 CSV 文件时会自动将缺失值识别为 NaN (Not a Number)。这是 Pandas 的一个默认行为,主要有以下几个原因

    1. 统一数据类型:将缺失值统一识别为 NaN 可以确保整个 DataFrame 的数据类型是统一的,这有助于后续的数据处理和分析。

    2. 方便处理缺失数据:识别缺失值为 NaN 可以让我们更方便地使用 Pandas 提供的一些函数和方法,如 dropna()fillna() 等,来处理缺失数据。

    3. 与数值计算兼容:NaN 值在数值计算时会被自动忽略,这可以避免一些计算错误。

     

    如果您不希望 Pandas 自动将缺失值识别为 NaN,可以尝试以下方法:

            1. 使用 na_values 参数指定缺失值的表示形式:

    df = pd.read_csv('drinks.csv', na_values=['missing', 'unknown'])
    

    在这个例子中,Pandas 会将 'missing' 和 'unknown' 这两个值识别为缺失值。

            2.使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为:

    df = pd.read_csv('drinks.csv', keep_default_na=False)
    

    这样 Pandas 就不会自动将空值识别为 NaN,而是会保留原始值。

            3.自定义缺失值标记:

    df = pd.read_csv('drinks.csv', na_filter=True, na_values='-999')
    

    在这个例子中,Pandas 会将 '-999' 视为缺失值。

     Pandas 对 DataFrame df 进行分组操作,具体分析如下:

    1. df['continent'] 是用来选择 DataFrame df 中名为 'continent' 的列。

    2. df.groupby(df['continent']) 将 DataFrame df 按照 'continent' 列的值进行分组。这个操作返回一个 DataFrameGroupBy 对象。

    3. 将这个 DataFrameGroupBy 对象赋值给变量 df_continent

    这个操作的目的是将原始 DataFrame 按照 'continent' 列的值划分成多个组,每个组包含了原始 DataFrame 中与该 'continent' 值对应的行。

    这样做的好处是可以对这些分组进行后续的数据分析和处理,比如:

    • 计算每个洲的平均值、标准差等统计指标
    • 对每个洲的数据进行特定的数据清洗操作
    • 基于每个洲的数据进行可视化分析

    要打印 df_continent 这个 DataFrameGroupBy 对象,可以使用以下方法:

    1. 遍历所有分组, 并打印每个分组的 DataFrame:
    1. for name, group in df_continent:
    2. print(f"Continent: {name}")
    3. print(group)
    4. print()

    这个方法会逐个打印每个分组的 DataFrame。name 变量保存的是分组的键值(即 'continent' 列的值),而 group 变量保存的是该分组对应的 DataFrame。

    1. 使用 groups 属性查看分组的键值:
    print(df_continent.groups)
    

    这将打印出一个字典,键为分组的键值,值为对应分组中行的索引。

    1. 选择特定的分组并打印:
    1. africa_group = df_continent.get_group('Africa')
    2. print(africa_group)

    这将打印出 'continent' 列值为 'Africa' 的那个分组的 DataFrame。

    1. 使用 describe() 方法打印分组的汇总统计信息:
    print(df_continent.describe())
    

    这将打印出每个分组的汇总统计信息,比如平均值、标准差、最小值等。

  • 相关阅读:
    概念解析 | 揭秘视觉与语言交叉模型:CLIP和BLIP的介绍
    搭建RabbitMQ消息服务,整合SpringBoot实现收发消息
    多商户商城系统功能拆解25讲-平台端分销申请
    首尾交换数组元素
    C语言 : 文件的操作
    风险管理案例题
    LinkedList详解-Deque接口链表实现方案
    TCP单进程循环服务器程序与单进程客户端程序
    PermissionError: [WinError 5] 拒绝访问。OSError: [WinError 17] 系统无法将文件移到不同的磁盘驱动器。
    知识图谱2(正则表达式语法)
  • 原文地址:https://blog.csdn.net/qq_74748121/article/details/139340002