Pandas数据分析 【Series | DataFrame】

pandas数据分析

  • 写在前面
    • [001 List转化为Series](#001 List转化为Series)
    • [002 Dict转化为Series](#002 Dict转化为Series)
    • [003 Series转化为python list](#003 Series转化为python list)
    • [004 Series转化为DataFrame](#004 Series转化为DataFrame)
    • [005 借助numpy创建Series](#005 借助numpy创建Series)
    • [006 转化Series的数据类型](#006 转化Series的数据类型)
    • [007 给Series添加新的元素](#007 给Series添加新的元素)
    • [008 将Series对象转换为DataFrame对象](#008 将Series对象转换为DataFrame对象)
    • [009 使用字典创建DF](#009 使用字典创建DF)
    • [010 给DataFrame设置索引列](#010 给DataFrame设置索引列)
    • [011 生成一个月的所有天](#011 生成一个月的所有天)
    • [012 生成一年中的所有周一日期](#012 生成一年中的所有周一日期)
    • [013 生成一天的所有小时](#013 生成一天的所有小时)
    • [014 用日期生成DataFrame](#014 用日期生成DataFrame)
    • [015 生成日期和随机分布DataFrame](#015 生成日期和随机分布DataFrame)
    • [016 打印DataFrame的前后数据](#016 打印DataFrame的前后数据)
    • [017 df的信息和基本数据统计](#017 df的信息和基本数据统计)
    • [018 统计数据列出现的次数](#018 统计数据列出现的次数)
    • [019 df前N行存入CSV文件](#019 df前N行存入CSV文件)
    • [020 加载CSV文件到df](#020 加载CSV文件到df)
  • 小结

写在前面

其实pandas市面上教程很多😀,之前零零碎碎自己学了很多知识点,但是缺少实操,这个库长时间不用老能忘记,这不马上又到了数模美赛了,涉及很多数据分析的时候,我又得捡起来复习一下这个库了,为了方便自己复习,这次我找了100个题目敲一遍,以博客的方式记录,减少自己之后的回顾成本。

这里我们不从头到尾讲pandas的详细知识点,因为python语言真的太易懂,最好有一点使用过pandas库的经验再来看本篇,在实际中的题目去体会这个库,我认为是最快且行之有效的,其实就算是讲pandas知识点,不也是通过案例讲吗哈哈,话不多说,开始!

001 List转化为Series

这道题目就是简单的将列表转化为Series对象,Series对象是pandas库里面比较重要的一个数据结构,转化成这个对象之后,更方便我们后续所做的一切数据处理,用到的方法也很简单就是使用pd.Series方法,要注意的是这个方法的第一个参数其实就是data,这里我们调用的时候可以不写,为了清晰,我这里写上了,代码如下。

python 复制代码
import pandas as pd
courses = ["语文", "数学", "英语", "计算机"]
data = pd.Series(data=courses)
print(data)

运行结果如下(默认情况是数字索引):

如果上段代码你有不清楚的地方也没关系,不需要纠结,继续看下面的案例,慢慢体会即可。


002 Dict转化为Series

和上题类似,pd.Series方法第一个参数也可以接收一个字典,只不过这次的Series对象索引不是数字了,而变成了字典中的key

python 复制代码
import pandas as pd
grades = {"语文": 80, "数学": 90, "英语": 85, "计算机": 100}
data = pd.Series(data=grades)
print(data)

003 Series转化为python list

如何将Series的values转化为list,在Seires对象中存在一个方法to_list()可以办到这一点,这里我们的data已经是一个Series对象了,直接调用即可,输出结果和题目要求相同。

python 复制代码
import pandas as pd
grades = {"语文": 80, "数学": 90, "英语": 85, "计算机": 100}
data = pd.Series(data=grades)
numbers=data.to_list()
print(numbers)

004 Series转化为DataFrame

本道题目我们就引出了pandas中第二个重要的数据结构DataFrame,pandas核心就是围绕着Series对象和DataFrame对象来进行一系列的数据处理的。 DataFrame 是用来表示表格数据的,而 Series 用来表示单列数据。

本题我们调用pd.DataFrame方法,注意题目要求是有列名的,所以要指定第二个参数columns

python 复制代码
import pandas as pd
grades = {"语文": 80, "数学": 90, "英语": 85, "计算机": 100}
data = pd.Series(grades)
df = pd.DataFrame(data, columns=['grades'])
print(df)

005 借助numpy创建Series

观察上图Series对象的index101到109,间隔为1,数据10到90,间隔为10,数据类型是float64

python 复制代码
import numpy as np
import pandas as pd
data=pd.Series(
    np.arange(10, 100, 10), #数值为10-90,间隔为10(100取不到,第二参数是开区间)
    index=np.arange(101, 110), #索引是101-109,间隔为1(可以缺省)
    dtype=float
)
print(data)

006 转化Series的数据类型

这里介绍两种转换Series类型的方法,第一种是astype方法,此时传参传的是想要转换后的类型,第二种方法是调用map方法,传参为int,对Series对象的每个元素调用int方法,注意区分这两个方法的区别,第二个方法int是一个python中的内置函数。

python 复制代码
import pandas as pd
s = pd.Series(
    data=["001", "002", "003", "004"],
    index=list("abcd")
)

s = s.astype(int) # 方法一,这里的int是一个类型
# s = s.map(int)  # 方法二,这里的int是一个函数,注意区分
print(s)

007 给Series添加新的元素

其实早期版本的python有append方法,但是之后去除了,现在添加Series对象推荐使用concat方法拼接。

python 复制代码
import pandas as pd
grades = {"语文": 80, "数学": 90, "英语": 85, "计算机": 100}
data = pd.Series(data=grades)

# pandas库中有cancat方法可以拼接Serires对象
#调用参数是一个列表[原始Series,新添加的Series]
data = pd.concat([data, pd.Series({"物理": 88, "化学": 95})])
print(data)

008 将Series对象转换为DataFrame对象

本题我们使用一个方法reset_index,这个方法可以使得原本的Series对象的key移动到数值位,设置为用数字作索引,并且类型直接就转化为了DataFrame,之后就是修改列名就好了。

python 复制代码
import pandas as pd
grades = {"语文": 80, "数学": 90, "英语": 85, "计算机": 100}
data = pd.Series(grades)
df = data.reset_index()
df.columns = ['course', 'grade']
print(df)

009 使用字典创建DF

可以借助字典直接转换,字典的key充当了列名。字典的value充当了每一列的具体数值。

python 复制代码
import pandas as pd
df = pd.DataFrame({
    "姓名": ["小张", "小王", "小李", "小赵"],
    "性别": ["男", "女", "男", "女"],
    "年龄": [18, 19, 20, 18]
})
print(df)

010 给DataFrame设置索引列

这里可以使用df.set_index方法,这个方法第一个参数指定的是要被设置成为索引的列,第二个参数意思是原地修改,如果不设置为True的话,调用后会将新的df返回,原来的DataFrame对象不发生改变。

python 复制代码
import pandas as pd
df = pd.DataFrame({
    "姓名": ["小张", "小王", "小李", "小赵"],
    "性别": ["男", "女", "男", "女"],
    "年龄": [18, 19, 20, 18]
})

#从这里开始完成题目
df.set_index("姓名", inplace=True)
print(df)

011 生成一个月的所有天

这里注意输出的类型是DatatimeIndex类型,是日期类型的索引,freq='D'意思是按天进行递增。

python 复制代码
import pandas as pd
#注意这里参数开始结束都是闭区间
data_range=pd.date_range(start='2021-10-01',end='2021-10-31')
#方法二:默认情况按天递增,递增31个数,输出结果同上
#data_range = pd.date_range(start='2021-10-01',periods=31)

print(data_range)

012 生成一年中的所有周一日期

  • 可以指定按照周一递增日期freq='W-MON'
python 复制代码
import pandas as pd

data_range = pd.date_range(start='2021-01-01',
                           end='2021-12-31' , freq='W-MON')
print(data_range)

013 生成一天的所有小时

  • periods个数设置为24,freq频率设置为H即可。
python 复制代码
import pandas as pd
data_range = pd.date_range(start='2021-01-01', periods=24, freq='H')
print(data_range)

014 用日期生成DataFrame

代码解析:df['day_of_year']这里没有这个索引,会直接新建,df['day']是日期类型。所以可以.dt访问日期类型的方法,其中dayofyear这个属性存储了日期索引在该年的第几天

python 复制代码
import pandas as pd
data_range = pd.date_range(start='2021-10-01', periods=31)
df = pd.DataFrame(data=data_range, columns=['day'])
# 代码走到这里,已经生成DataFrame对象了,只不过此时只有一列
df['day_of_year'] = df['day'].dt.dayofyear
print(df)

015 生成日期和随机分布DataFrame

  • 这里涉及到了numpy库中的 random
python 复制代码
import pandas as pd
import numpy as np
data_range = pd.date_range(start='2021-10-01', periods=1000)
data ={
    'norm': np.random.normal(loc=0,scale=1,size=1000), #代表均值为0,方差为1
    'uniform': np.random.uniform(low=0,high=1,size=1000), #均匀分布最小值为0,最大值为1
    'binnormal': np.random.binomial(n=1,p=0.2,size=1000) #样本为1,发生概率为0.2
}
df = pd.DataFrame(data = data,index=data_range)
print(df)

016 打印DataFrame的前后数据

python 复制代码
import pandas as pd
import numpy as np
data_range = pd.date_range(start='2021-10-01', periods=1000)
data ={
    'norm': np.random.normal(loc=0,scale=1,size=1000), #代表均值为0,方差为1
    'uniform': np.random.uniform(low=0,high=1,size=1000), #均匀分布最小值为0,最大值为1
    'binnormal': np.random.binomial(n=1,p=0.2,size=1000) #样本为1,发生概率为0.2
}
df = pd.DataFrame(data = data,index=data_range)
#从这里开始完成题目
print(df.head(10))
print()
print(df.tail(5))

017 df的信息和基本数据统计

这个题目主要是为了了解df.info()df.describe()这两个方法,它们非常的有用,他们可以帮助我们查看该数据结构中的一些重要的数据信息,以便后续的计算。

python 复制代码
import pandas as pd
import numpy as np
data_range = pd.date_range(start='2021-10-01', periods=1000)
data ={
    'norm': np.random.normal(loc=0,scale=1,size=1000), #代表均值为0,方差为1
    'uniform': np.random.uniform(low=0,high=1,size=1000), #均匀分布最小值为0,最大值为1
    'binnormal': np.random.binomial(n=1,p=0.2,size=1000) #样本为1,发生概率为0.2
}
df = pd.DataFrame(data = data,index=data_range)
#从这里开始完成题目
print(df.info())
print()
df.describe()

018 统计数据列出现的次数

  • value_counts()这个方法就会返回一个Series对象中出现了哪些值,出现了多少次的信息。
  • 我们先用df["binnormal"]取出pandas库对应的目标列,接着直接调用该方法打印即可。
python 复制代码
import pandas as pd
import numpy as np
data_range = pd.date_range(start='2021-10-01', periods=1000)
data ={
    'norm': np.random.normal(loc=0,scale=1,size=1000), #代表均值为0,方差为1
    'uniform': np.random.uniform(low=0,high=1,size=1000), #均匀分布最小值为0,最大值为1
    'binnormal': np.random.binomial(n=1,p=0.2,size=1000) #样本为1,发生概率为0.2
}
df = pd.DataFrame(data = data,index=data_range)
#从这里开始完成题目
print(df["binnormal"].value_counts())

019 df前N行存入CSV文件

  • 直接调用to_csv 方法即可。
python 复制代码
import pandas as pd
import numpy as np
data_range = pd.date_range(start='2021-10-01', periods=1000)
data ={
    'norm': np.random.normal(loc=0,scale=1,size=1000), #代表均值为0,方差为1
    'uniform': np.random.uniform(low=0,high=1,size=1000), #均匀分布最小值为0,最大值为1
    'binnormal': np.random.binomial(n=1,p=0.2,size=1000) #样本为1,发生概率为0.2
}
df = pd.DataFrame(data = data,index=data_range)
#从这里开始完成题目
df.to_csv("前100行数据.csv")

打开文件看看(展示部分)

  • CSV是文本文件,对于参加数学建模的同学来说这个应该不是很陌生,因为很多题目给的数据就是.csv格式,所以学会使用pandas库处理.csv格式的数据是必要的。

020 加载CSV文件到df

python 复制代码
import pandas as pd
import numpy as np
df=pd.read_csv("前100行数据.csv",index_col=0)#第二个参数是为了恢复索引列
print(df.info())
print(df.head(10))

小结

本篇主要是介绍了pandas库里面最重要的两个数据结构,Series对象和DataFrame对象,它们的数据处理功能十分强大,我会把这一python系列新开一份专栏,后面的题目我们结合具体情景再探讨。

相关推荐
Want59539 分钟前
Python新春烟花
开发语言·python·pygame
martian66544 分钟前
第14篇:从入门到精通:掌握python上下文管理器
开发语言·python
梦魇梦狸º1 小时前
mac 安装 python2
python·macos
deephub1 小时前
金融波动率的多模型建模研究:GARCH族与HAR模型的Python实现与对比分析
开发语言·人工智能·python·机器学习·金融·波动率
金融OG1 小时前
99.12 金融难点通俗解释:毛利率
python·算法·机器学习·数学建模·金融
卜及中2 小时前
【Pytest】基础到高级功能的理解使用
开发语言·python·学习·pytest·python3.11
qq_433502183 小时前
Browser-Use WebUI项目启动指南
人工智能·经验分享·python·chatgpt
Hugh&7 小时前
(开源)基于Django+Yolov8+Tensorflow的智能鸟类识别平台
python·yolo·django·tensorflow
CodeZ-Hao9 小时前
httpx上传文件/IO流缓慢的问题分析及解决
python·压力测试·httpx
蹦蹦跳跳真可爱58910 小时前
Python----Python高级(模块与包,Python基本库)
开发语言·python