挑战30天学完Python:Day25 pandas

🎉 本系列为Python基础学习,原稿来源于 30-Days-Of-Python 英文项目,大奇主要是对其本地化翻译、逐条验证和补充,想通过30天完成正儿八经的系统化实践。此系列适合零基础同学,或仅了解Python一点知识,但又没有系统学习的使用者。总之如果你想提升自己的Python技能,欢迎加入《挑战30天学完Python》

  • 📘 Day 25
    • Pandas
    • DataFrames
    • 使用Pandas读取CSV文件
    • 编辑 DataFrame
    • 检查列值的数据类型
    • 💻 第25天练习

📘 Day 25

Pandas

Pandas是Python程序语言中一种开源、高性能、易于使用的数据结构和数据分析工具。
Pandas添加了数据结构和工具,用于处理类似表格的数据,即 SeriesData Frames
它主要提供的数据操作工具有:

  • reshaping
  • merging
  • sorting
  • slicing
  • aggregation
  • imputation

安装pandas包

conda install pandas

Pandas数据结构基于 SeriesDataFrames

一个 series 是一个 column,一个DataFrame是一个由series 集合组成的多维表 。为了创建pandas series,我们使用numpy来创建一个一维数组或python列表。

首先让我们看下 series 例子:

Names Pandas Series

在这里插入图片描述

Countries Series

在这里插入图片描述

Cities Series

在这里插入图片描述

如您所见,pandas系列只是一列数据。如果我们想要有多个列,我们使用 data frames。下面的例子展示了pandas数据框架。

在这里插入图片描述

DataFrame 是行和列的集合。请看下面的表格,它比上面的例子有更多的表列:

在这里插入图片描述

接下来,我们将了解如何导入pandas,以及如何使用pandas创建 Seriesdataframe

引入 Pandas

import pandas as pd
import numpy  as np

创建默认索引的Pandas Series

nums = [1, 2, 3, 4,5]
s = pd.Series(nums)
print(s)

默认索引从0开始

0    1
1    2
2    3
3    4
4    5
dtype: int64

创建自定义索引的Pandas Series

示例1:

nums = [1, 2, 3, 4, 5]
s = pd.Series(nums, index=[1, 2, 3, 4, 5]) # 指定索引1-5
print(s)
    1    1
    2    2
    3    3
    4    4
    5    5
    dtype: int64

示例2

fruits = ['Orange','Banana','Mango']
fruits = pd.Series(fruits, index=[1, 2, 3]) # 指定索引1-3,列值类型object
print(fruits)
1    Orange
2    Banana
3     Mango
dtype: object

从字典创建Pandas Series

dct = {'name':'Asabeneh','country':'Finland','city':'Helsinki'}
s = pd.Series(dct)
print(s)

行索引为字典key

name       Asabeneh
country     Finland
city       Helsinki
dtype: object

创造一个常量Pandas Series

s = pd.Series(10, index = [1, 2, 3])
print(s)
1    10
2    10
3    10
dtype: int64

使用Linspace创建Pandas Series

Linspace 表示线性等分向量

# linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,axis=0)
# 参数 num 表示样本数量
s = pd.Series(np.linspace(5, 20, 10))
print(s)
0     5.000000
1     6.666667
2     8.333333
3    10.000000
4    11.666667
5    13.333333
6    15.000000
7    16.666667
8    18.333333
9    20.000000
dtype: float64

DataFrames

Pandas DataFrames 可以通过以下不同的方式进行创建

从二维列表中创建

data = [
    ['Asabeneh', 'Finland', 'Helsink'], 
    ['David', 'UK', 'London'],
    ['John', 'Sweden', 'Stockholm']
]
df = pd.DataFrame(data, columns=['Names','Country','City'])
print(df)
      Names  Country       City
0  Asabeneh  Finland    Helsink
1     David       UK     London
2      John   Sweden  Stockholm

从Dict字典创建

data = {'Name': ['Asabeneh', 'David', 'John'], 'Country':[
    'Finland', 'UK', 'Sweden'], 'City': ['Helsiki', 'London', 'Stockholm']}
df = pd.DataFrame(data)
print(df)
      Name  Country       City
0  Asabeneh  Finland    Helsiki
1     David       UK     London
2      John   Sweden  Stockholm

从列表字典创建

data = [
    {'Name': 'Asabeneh', 'Country': 'Finland', 'City': 'Helsinki'},
    {'Name': 'David', 'Country': 'UK', 'City': 'London'},
    {'Name': 'John', 'Country': 'Sweden', 'City': 'Stockholm'}]
df = pd.DataFrame(data)
print(df)
       Name  Country       City
0  Asabeneh  Finland   Helsinki
1     David       UK     London
2      John   Sweden  Stockholm

使用Pandas读取CSV文件

在此项目中的 /data/weight-height.csv 找到示例文件

import pandas as pd

df = pd.read_csv('./data/weight-height.csv')
print(df)
      Gender     Height      Weight
0       Male  73.847017  241.893563
1       Male  68.781904  162.310473
2       Male  74.110105  212.740856
3       Male  71.730978  220.042470
4       Male  69.881796  206.349801
...      ...        ...         ...
9995  Female  66.172652  136.777454
9996  Female  67.067155  170.867906
9997  Female  63.867992  128.475319
9998  Female  69.034243  163.852461
9999  Female  61.944246  113.649103

[10000 rows x 3 columns]

数据探索

让我们使用 head() 只读取前5行

# head(self: NDFrameT, n: int = 5)
print(df.head()) 

不指定行数默认前5行

  Gender     Height      Weight
0   Male  73.847017  241.893563
1   Male  68.781904  162.310473
2   Male  74.110105  212.740856
3   Male  71.730978  220.042470
4   Male  69.881796  206.349801

让我们学习使用 tail() 方法来获取数据表的尾部行。

# tail(self: NDFrameT, n: int = 5)
print(df.tail()) 
9995  Female  66.172652  136.777454
9996  Female  67.067155  170.867906
9997  Female  63.867992  128.475319
9998  Female  69.034243  163.852461
9999  Female  61.944246  113.649103

正如您所看到的csv文件有3列:性别、身高和体重。且有1000行,如果 DataFrame 有很多行列,我们就需要一种方法来知晓行列数据,对此我们使用 shape 方法。

df = pd.read_csv('./data/weight-height.csv')
print(df.shape)
# (10000, 3)

使用 columns 方法获得所有列,返回列头。

print(df.columns)
# Index(['Gender', 'Height', 'Weight'], dtype='object')

现在,让我们使用列Key获取一个特定的列

heights = df['Height']  # 现在它成为一个 series
print(heights) 
0       73.847017
1       68.781904
2       74.110105
3       71.730978
4       69.881796
          ...
9995    66.172652
9996    67.067155
9997    63.867992
9998    69.034243
9999    61.944246
Name: Height, Length: 10000, dtype: float64

其他列如法炮制均可通过列头关键词获取一列值

接下来我们再来了解下 *describe()*方法,它提供数据集的一些描述性统计值。

print(heights.describe()) # 给出关于身高列的一些统计信息
count    10000.000000
mean        66.367560
std          3.847528
min         54.263133
25%         63.505620
50%         66.318070
75%         69.174262
max         78.998742
Name: Height, dtype: float64
print(df.describe())  # 对整个dataFrame的统计信息
             Height        Weight
count  10000.000000  10000.000000
mean      66.367560    161.440357
std        3.847528     32.108439
min       54.263133     64.700127
25%       63.505620    135.818051
50%       66.318070    161.212928
75%       69.174262    187.169525
max       78.998742    269.989699

类似 describe(), 还有 info() 方法同样也给出关于数据集的一些统计。

编辑 DataFrame

维护 DataFrame 我们可以:

  • 创建一个新的 DataFrame
  • 创建一个新的列到 DataFrame
  • 从 DataFrame 移除一个存在列
  • 修改一个存在 DataFrame 的列
  • 改变 DataFrame 列的数据类型

创建

像往常一样,首先我们要导入依赖包。现在,让我们导入pandas和numpy,通常它俩是很好的组合。

import pandas as pd
import numpy as np
data = [
    {"Name": "Asabeneh", "Country":"Finland","City":"Helsinki"},
    {"Name": "David", "Country":"UK","City":"London"},
    {"Name": "John", "Country":"Sweden","City":"Stockholm"}]
df = pd.DataFrame(data)
print(df)
       Name  Country       City
0  Asabeneh  Finland   Helsinki
1     David       UK     London
2      John   Sweden  Stockholm

如果想向DataFrame中添加列,可以像向字典中添加键一样操作。

添加列

让我们向其上边的姓名国家和城市的DataFrame添加一列体重信息

weights = [74, 78, 69]
df['Weight'] = weights
print(df)
       Name  Country       City  Weight
0  Asabeneh  Finland   Helsinki      74
1     David       UK     London      78
2      John   Sweden  Stockholm      69

最后再向其 DataFrame 添加一份身高信息

heights = [173, 175, 169]
df['Height'] = heights
print(df)
       Name  Country       City  Weight  Height
0  Asabeneh  Finland   Helsinki      74     173
1     David       UK     London      78     175
2      John   Sweden  Stockholm      69     169

在上边的例子中,我们添加了体重和身高两个新列。接下来让我们看下如何改变值。

修改列值

直接对其整列进行操作,比如对身高单位换成米单位值

df['Height'] = df['Height'] * 0.01
print(df)
       Name  Country       City  Weight  Height
0  Asabeneh  Finland   Helsinki      74    1.73
1     David       UK     London      78    1.75
2      John   Sweden  Stockholm      69    1.69

接下来我们再新增一列BMI(Body Mass Index),它表示身体质量指数,计算公式为:BMI=体重÷身高²。

def calculate_bmi ():
    weights = df['Weight']
    heights = df['Height']
    bmi = []
    for w,h in zip(weights, heights):
        b = w/(h*h)
        bmi.append(b)
    return bmi
    
bmi = calculate_bmi()
df['BMI'] = bmi
print(df)

使用函数可以使我们的代码更简洁,但是不使用函数也可以计算bmi

df['BMI'] = df['Weight'] / (df['Height'] * df['Height'])
print(df)

以上两种方式的结果一样如下:

       Name  Country       City  Weight  Height        BMI
0  Asabeneh  Finland   Helsinki      74    1.73  24.725183
1     David       UK     London      78    1.75  25.469388
2      John   Sweden  Stockholm      69    1.69  24.158818

格式化

DataFrame的BMI列值是浮点数,让我们格式化一下仅保留一位小数。

df['BMI'] = round(df['BMI'], 1)
print(df)
0  Asabeneh  Finland   Helsinki      74    1.73  24.7
1     David       UK     London      78    1.75  25.5
2      John   Sweden  Stockholm      69    1.69  24.2

DataFrame中的信息似乎还不太完整,让我们再继续添加出生年份和当前年份两列。

birth_year = ['1769', '1985', '1990']
current_year = pd.Series(2023, index=[0, 1,2])
df['Birth Year'] = birth_year
df['Current Year'] = current_year
print(df)
       Name  Country       City  Weight  Height   BMI Birth Year  Current Year
0  Asabeneh  Finland   Helsinki      74    1.73  24.7       1769          2023
1     David       UK     London      78    1.75  25.5       1985          2023
2      John   Sweden  Stockholm      69    1.69  24.2       1990          2023

检查列值的数据类型

print(df.Weight.dtype)
int64
print(df['Birth Year'].dtype) 

它给出类型是字符串对象,让我们来把它改为整数类型

df['Birth Year'] = df['Birth Year'].astype('int')
print(df['Birth Year'].dtype) 
int32

同样,我们对年份也改下对应的列数值类型

df['Current Year'] = df['Current Year'].astype('int')
print(df['Current Year'].dtype)
dtype('int32')

现在,出生年份和当前年份的列值是整数。我们接下来就可以计算其年龄了。

ages = df['Current Year'] - df['Birth Year']
print(ages)
0    254
1     38
2     33
dtype: int32

最后将计算后的年龄列追加到dataframe数据中

df['Ages'] = ages
print(df)
       Name  Country       City  Weight  Height   BMI  Birth Year  Current Year  Ages
0  Asabeneh  Finland   Helsinki      74    1.73  24.7        1769          2023   254
1     David       UK     London      78    1.75  25.5        1985          2023    38
2      John   Sweden  Stockholm      69    1.69  24.2        1990          2023    33

请注意,第一行值中年龄足有254岁,人是不可能活那么久的,这里只是为了演示和为下边的判断操作做铺垫。

布尔索引

过滤出年龄大于120的数据

print(df[df['Ages'] > 120])
       Name  Country      City  Weight  Height   BMI  Birth Year  Current Year  Ages
0  Asabeneh  Finland  Helsinki      74    1.73  24.7        1769          2023   254

查看年龄小于120的数据

print(df[df['Ages'] < 120])
    Name Country       City  Weight  Height   BMI  Birth Year  Current Year  Ages
1  David      UK     London      78    1.75  25.5        1985          2023    38
2   John  Sweden  Stockholm      69    1.69  24.2        1990          2023    33

💻 第25天练习

  1. 从数据目录中读取 /data/hacker_news.csv 文件
  2. 获取前5行数据
  3. 获取最后5行数据
  4. 获得标题,数据作为一个pandas series返回
  5. 计算这个dataframe的行和列个数
    • 过滤包含python的标题
    • 过滤包含JavaScript的标题
    • 尝试对数据做一些增改计算格式化等操作

🎉 CONGRATULATIONS ! 🎉

<< Day 24 | Day26 >>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/422679.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能家居控制系统(51单片机)

smart_home_control_system 51单片机课设&#xff0c;智能家居控制系统 使用及转载请标明出处&#xff08;最好点个赞及star哈哈&#xff09; Github地址&#xff0c;带有PPT及流程图 Gitee码云地址&#xff0c;带有PPT及流程图 ​ 以STC89C52为主控芯片&#xff0c;以矩阵键…

KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)

**《KubeSphere平台安装系列》** 【Kubernetes上安装KubeSphere&#xff08;亲测–实操完整版&#xff09;】&#xff08;1/3&#xff09; 【Linux单节点部署KubeSphere】&#xff08;2/3&#xff09; 【Linux多节点部署KubeSphere】&#xff08;3/3&#xff09; **《KubeS…

云时代【6】—— 镜像 与 容器

云时代【6】—— 镜像 与 容器 四、Docker&#xff08;三&#xff09;镜像 与 容器1. 镜像&#xff08;1&#xff09;定义&#xff08;2&#xff09;相关指令&#xff08;3&#xff09;实战演习镜像容器基本操作离线迁移镜像镜像的压缩与共享 2. 容器&#xff08;1&#xff09;…

【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱

1 基本定义 SG 滤波算法&#xff08;Savitzky - Golay 滤波算法&#xff09;是一种数字信号处理算法&#xff0c;用于对信号进行平滑处理。该算法利用最小二乘法拟合局部数据段&#xff0c;然后用拟合的函数来估计每个数据点的值&#xff0c;从而实现平滑处理。 SG 滤波算法的…

【MySQL】表的内连和外连(重点)

表的连接分为内连和外连。 一、内连接 内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选&#xff0c;前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件; 注意&…

计算机毕业设计分享-ssm心理咨询预约管理系统 19086(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

本科生毕业设计&#xff08;论文&#xff09; 题 目心理咨询预约管理系统的设计与实现 学 院 XXXXX 专业班级 XXXXX 学生姓名 XXXX 指导岗位 XXXX 撰写日期&#xff1a;2023年4月 目 录 摘要 1 绪论 1.1背景及意义 …

输入一个整数,输出其最长连续因子。

输入一个整数&#xff0c;输出其最长连续因子。 例如 输入&#xff1a;60 输出&#xff1a;2 3 4 5 6 注意&#xff1a;1不算因子 输入输出格式 输入描述: 输入一个整数N&#xff0c;N<10000。 输出描述: 输出其最长连续因子&#xff0c;如果有多个最长&#xff0c;输出…

Linux篇: 进程控制

一、进程创建 1.1 fork函数初识 在Linux中&#xff0c;fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a; 在子进程中返回0&#xff0c;父进程中返回子进程的PID&#xff0c;子进程创…

#WEB前端

1.实验&#xff1a;vscode安装&#xff0c;及HTML常用文本标签 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; &#xff08;1&#xff09;网页直接搜索安装vscode &#xff08;2&#xff09;打开vscode&#xff0c;在下图分别安装以下插件&#xff1a; Html Css Support …

PowerDesigner中怎么给ER图中字段设置默认值

双击table&#xff0c;进入数据库表详情页 详情页点击【Columns】 双击你要设置默认值得栏目&#xff0c;例如我得删除标记 点击【Standard Checks】&#xff0c;在【Defalut】中录入你想要得默认值&#xff0c;点击【应用即可】

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍&#xff1a;https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本&#xff08;谨慎更新&#xff09; 如果升级驱动出现问题&#xff0c;重启驱动软件后会默认让你恢复的。 …

【Vue】更换浏览器默认 logo

更换浏览器默认logo为自定义图片 一. 浏览器默认 logo二. 替换为自定义logo三. 步骤3.1 转换大小3.1.1 查看图片尺寸3.1.2 修改尺寸&#xff08;为32px 32px&#xff09; 3.2 替换成功 一. 浏览器默认 logo 二. 替换为自定义logo 三. 步骤 3.1 转换大小 将自定义 logo 转为323…

AcWing 788. 逆序对的数量 解题思路及代码

先贴个题目&#xff1a; 以及原题链接&#xff1a; 788. 逆序对的数量 - AcWing题库https://www.acwing.com/problem/content/790/ 这题也是板子题&#xff0c;就是对归并排序的衍生&#xff0c;我们先分析下如果用归并排序对排序区间进行二分的话&#xff0c;逆序对可能出现的…

[计算机网络]--五种IO模型和select

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、五种IO…

Selenium 遇见伪元素该如何处理?

问题发生 在很多前端页面中&#xff0c;大家会见到很多&#xff1a;:before、::after 元素&#xff0c;比如【百度流量研究院】&#xff1a; 比如【百度疫情大数据平台】&#xff1a; 以【百度疫情大数据平台】为例&#xff0c;“累计确诊”文本并没有显示在 HTML 源代码中&am…

探寻2024年国内热门低代码平台排行!| 功能特点一览

低代码开发是一项革命性的技术&#xff0c;主要目的是尽量避免程序研发的复杂性&#xff0c;让外行开发者也能加入到应用程序的搭建中。低代码平台的核心概念和构成部分通常包括用户界面和拖拽设计、预构件和模块、自动化工作内容与数据库集成和扩展应用&#xff0c;应用低代码…

Python爬虫Cookies 池的搭建

Cookies 池的搭建 很多时候&#xff0c;在爬取没有登录的情况下&#xff0c;我们也可以访问一部分页面或请求一些接口&#xff0c;因为毕竟网站本身需要做 SEO&#xff0c;不会对所有页面都设置登录限制。 但是&#xff0c;不登录直接爬取会有一些弊端&#xff0c;弊端主要有…

Python中几个必须知道的函数

Python中自带了几个比较有意思的函数&#xff0c;一般在面试或者笔试基础的时候会问到&#xff0c;其中3个就是map、filter、reduce函数。 1.map(function, iterable) 它第一个要传的元素是函数名或lambda匿名函数表达式&#xff0c;第二个元素传入可迭代对象。 array [1,2,…

Java中心校智慧校园智慧班牌物联网平台源码

目录 智慧班牌 班牌首页 班级信息 课表信息 视频 图片 进离校管理 人脸登录页 学生个人中心 请假管理 成绩管理 家长留言 学生绑卡 学生评价 系统设置 通知管理 值日管理 倒计时 班级德育 班牌模式 1.课堂授课模式 2.家长会签到模式 3.考场模式 4.班级…

机器学习:模型评估和模型保存

一、模型评估 from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 使用测试集进行预测 y_pred model.predict(X_test)# 计算准确率 accuracy accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy*100:.2f}%")# 打印…