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
对象的index
是101到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系列新开一份专栏,后面的题目我们结合具体情景再探讨。