Pandas练习

devtools/2024/9/29 19:27:28/

一 题目要求

酒类消费数据
给定一个某段时间内各个国家的酒类消费数据表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文件

# 使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为
def read_drinks_data():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()

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

3 计算总数 sum()

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

二 完整代码实现

import pandas as pd# 使用 keep_default_na 参数关闭 Pandas 的默认缺失值识别行为
def read_drinks_data():return pd.read_csv('drinks.csv', keep_default_na=False)# 计算最大
def get_max_value_and_country(df, column_name):max_value = df[column_name].max()max_row = df[df[column_name] == max_value]return max_row['country'].values[0], max_value# 计算总数
def print_continent_totals(df_continent):for name, group in df_continent:print(name)print(group['beer_servings'].sum(), group['spirit_servings'].sum(), group['wine_servings'].sum())print()def main():data = read_drinks_data()df = pd.DataFrame(data)df_continent = df.groupby(df['continent'])print_continent_totals(df_continent)max_beer_country, max_beer_servings = get_max_value_and_country(df, 'beer_servings')print(max_beer_country, max_beer_servings)max_spirit_country, max_spirit_servings = get_max_value_and_country(df, 'spirit_servings')print(max_spirit_country, max_spirit_servings)max_wine_country, max_wine_servings = get_max_value_and_country(df, 'wine_servings')print(max_wine_country, max_wine_servings)if __name__ == "__main__":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:
for name, group in df_continent:print(f"Continent: {name}")print(group)print()

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

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

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

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

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

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

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


http://www.ppmy.cn/devtools/45503.html

相关文章

C#语言进阶(三) 元组

总目录 C# 语法总目录 元组目录 元组1. 元组元素命名2. 元组的解构3. 元组的比较 元组 元组(tuple)是一组存储值的便捷方式。 元组的目的主要是,不使用out参数而从方法中返回多个值。(匿名类型无法做这个操作)元组能做匿名类型所有操作。 元组是值类型&#xff0…

【自动驾驶技术】自动驾驶汽车AI芯片汇总——地平线篇

0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。 本篇文章是这个系列的第二篇&#x…

从CSV到数据库(简易)

需求:客户上传CSV文档,要求CSV文档内容查重/插入/更新相关数据。 框架:jdbcTemplate、commons-io、 DB:oracle 相关依赖: 这里本来打算用的2.11.0,无奈正式项目那边用老版本1.3.1,新版本对类型…

SourceTree跳过注册方法跳过注册页

方法一: 1.打开SourceTree 2.关闭SourceTree 3.命令终端输入 defaults write com.torusknot.SourceTreeNotMAS completedWelcomeWizardVersion 3 4.打开SourceTree即可跳过登录 方法二: 1.关闭SourceTree 2.右键SourceTree选择【显示包内容】 3.在Conten…

Python | 类的实现

权限控制 私有属性访问 装饰器property 和gender.setter 有个小错误:应该使用我的属性名称 多态: 编写对象 继承多个父类 子类: 面对对象的方法重写: 例如: 多态: object类 直接输出对象名相当于调用_str_…

掌控未来,爱普生SR3225SAA用于汽车钥匙、射频电路的智慧引擎

为了响应市场需求,Epson使用独家QMEMS*2技术所生产的石英振荡器,与其精巧的半导体技术所制造的射频传输器电路,开发了SR3225SAA。不仅内建的石英震荡器之频率误差仅有2 ppm,更使其封装尺寸达仅3.2 mm x 2.5 mm,为客户大…

【linux软件基础知识】链表数据结构

双向循环链表 新链表是用LIST_HEAD(list_name)宏创建的。如上图中的(b)空链表所示,它申明类型为 list head的变量name,该变量作为新链表头的占位符。LIST_HEAD(list_name)宏还初始化 list head数据结构的 prev和next 字段,让它们指向list_name 变量本身。代码如下 #define…

Flutter 验证码输入框

前言: 验证码输入框很常见:处理不好 bug也会比较多 想实现方法很多,这里列举一种完美方式,完美兼容 软键盘粘贴方式 效果如下: 之前使用 uniapp 的方式实现过一次 两种方式(原理相同)&#xff1…