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文件

# 使用 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.mzph.cn/web/20771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言编程实现导数运算:深入探索与实战解析

C语言编程实现导数运算:深入探索与实战解析 在数学的广袤领域中,导数运算扮演着至关重要的角色,它描述了函数值随自变量变化的速率。然而,将这一理论应用于实际编程中,尤其是使用C语言,却是一项充满挑战的…

【启程Golang之旅】从结构到接口揭秘Go的“面向对象”面纱

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…

ICPC训练赛补题集

ICPC训练赛补题集 文章目录 ICPC训练赛补题集D - Fast and Fat (负重越野)I-路径规划G. Inscryption(邪恶铭刻)NEW Houses雪中楼(西安交通大学)L.BracketGenerationE - Checksum D - Fast and Fat (负重越野) 原题链接:原题链接 题意:体重大的背体重小的…

【面试题-004】ArrayList 和 LinkList区别

ArrayList 和 LinkedList 都是 Java 中常用的动态数组实现,都实现了 List 接口,但它们在内部数据结构和性能方面有所不同: 内部数据结构: ArrayList 是基于动态数组的数据结构,它允许快速随机访问。数组的大小在创建时…

chat1-ClientServer连接

此文件中描述了Client和Server连接的过程 一、Server: 服务端用ServerSocket对象开启一个端口。并用while循环调用ServerSocket对象的accept() 方法等待客户端连接。 package chat1;import java.io.*; import java.util.Map;import java.net.ServerSocket;import ja…

Nginx 实战-05-nginx 反向代理实现域名到指定的 ip

前言 大家好,我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的,可以参考我的另一个项目: 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

杂谈-青少年信奥赛

青少年信奥赛详解 一、引言 青少年信息学奥林匹克竞赛(简称信奥赛或NOI)是一项面向全球青少年的计算机科学竞赛,旨在通过竞赛的形式,激发青少年对计算机科学和编程的兴趣,培养他们的创新思维和解决问题的能力。自诞生…

【c语言】探索内存函数

探索内存函数 memcpy函数memmove函数memset函数memcmp函数: memcpy函数 memcpy函数声明: void * memcpy ( void * destination, const void * source, size_t num );将source空间下的num个字符复制到dest中去 函数的使用: 将字符数组a的5字…

用java实现客服聊天+网络爬虫下载音乐(java网络编程,io,多线程)

一 灵感: 在2022年的暑假,也就是我即将迈进高三的那个暑假,我并没有察觉自己应该要学习了,还是和过往的暑假一样玩着王者荣耀,凌晨2点睡觉,中午12点起床。我依稀记得这种状态一直持续到8月19。然而离开学还…

【MySQL】Linux安装MySQL

一、center OS环境准备 为了在Linux系统中查看MySQL5.8与8.0版本的区别 我们要准备两个虚拟机,需要的软件:VMware和CentOS7 因为博主之前在学习redis的时候已经安装过一个虚拟机了,所以我就直接克隆了一个CentOS2.0 修改mac地址&#xff0…

STM32作业实现(二)串口控制led

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

用python画一艘“福建舰”

import turtle # 设置画布和画笔 screen turtle.Screen() screen.bgcolor("white") pen turtle.Turtle() pen.speed(10) pen.color("blue") pen.penup() # 航母主体(简化为一个矩形) pen.goto(-200, 0) pen.pen…

路由和交换网络技术有哪些内容?

1. 路由器和交换机的基本概念:了解路由器和交换机的定义、功能和区别,以及它们在网络中的重要作用。 2. 路由协议:掌握常见的路由协议,如静态路由、动态路由和默认路由,以及它们的工作原理和使用场景。 3. VLAN和IP地址…

深入理解Java中的List集合:解析实例、优化技巧与最佳实践

一:List 集合的基础 1.1 什么是 List 集合? List 集合是 Java 集合框架中的一种有序、可重复的数据结构,它继承自Collection 接口,允许存储多个元素。 与数组不同,List 集合的大小是动态可变的,可以根据…

通过指针变量访问整型变量

有两个与指针变量有关的运算符: (1)&:取地址运算符。 (2)*:指针运算符(或称间接访问运算符)。 例如:&a为变量a的地址,*p为指针变量p所指向的存储单元。 编写程序: 运行结果…

【面试经典150题】移除元素

目录 一.移除元素 一.移除元素 这题的思路非常清晰&#xff0c;可以使用迭代器遍历找到需要删除的元素使用erase删除即可&#xff1a; #include<iostream> #include<vector>using namespace std;class Solution { public:int removeElement(vector<int>&…

设计模式(六)结构型模式---桥接模式

文章目录 桥接模式简介结构优点UML图具体实现UML图代码实现 桥接模式简介 桥接模式是一种将抽象与实现分离&#xff0c;使它们独立变化。然后利用组合关系来代替继承关系&#xff0c;大大的降低了抽象和实现的耦合度的设计模式。实际使用&#xff1a; JDBC源码分析&#xff0c…

C语言习题~day26

1.以下关于枚举的说法&#xff0c;哪个是正确的&#xff1f; A.枚举类型可以具有浮点数作为枚举值。 B.枚举类型在内存中存储为整数。 C.枚举类型可以包含字符串作为枚举值。 D.枚举类型不能作为函数的参数传递。 B 2.下面代码的结果是&#xff1a;&#xff08; &#xff0…

Kotlin 继承和实现

文章目录 前言继承&#xff08;extend&#xff09;实现&#xff08;implement&#xff09;继承与实现 前言 在 Kotlin 中&#xff0c;继承和实现都是在类名后使用冒号:&#xff0c;后边加上其他类或接口的名称来表示&#xff0c;二者之间写法没有太大区别&#xff08;类需要加…

Xcode下载安装

1.Xcode可用版本判断&#xff1a; 2.Xcode下载安装&#xff1a; 方案1:AppStore 下载更新 若方案1失败则 方案2:指定版本Xcode包下载解压安装 苹果下载 3.Xcode命令行工具插件安装 xcode-select --install 备注&#xff1a; xcode_x.x.x.xip(压缩包存在时效性(使用前24h/…