Python强大的Pandas库—数据艺术家
日期:2021/4/21
作者:就叫易易好了
pandas是Python中的一个库,是一个强大的分析结构化数据集。
pandas中的常见的数据结构有两种:
Series:类似于一维数组的对象
DataFrame:类似多维数组/表格数组,每列数据可以是不同的类型数据
1、基本操作
建立一个列表
import pandas as pd
import numpy as np
s=pd.Seris([1,55,67,8,np.nan,22])
print(s)
运行结果为:
建立一个多维数组DataFrame
df=pd.DataFrame(np.random.randn(6,4),
index=['1','2','3','4','5','6'],columns=['a','b','c','d'])
print(df)
#行的索引是index,列的索引是columns
用1,2,3,4,5,6定义行的索引,用字母a,b,c,d定义列的索引,生成随机数
运行结果为:
也可以不规定行和列的索引,用默认的索引
df1=pd.DataFrame(np.arange(12).reshape((3,4)))
print(df1)
运行结果为:
可以用字典的方式来建立二维表
df2=pd.DataFrame({
'A':1.,
'B':pd.Timestamp('20210421'),
'C':pd.Series(1,index=list(range(4)),dtype='float32'),
'D':np.array([3]*4,dtype='int32'),
'E':pd.Categorical(["mm","gg","mm","gg"]),
'F':'lala'
})
df2
运行结果为:
可以用dtypes来查看各个数据类型
可以用index来查看所有行的序号,columns查看所有列的序号
values可以打印每一行的数据
describe可以描述数据类型
可以看到,describe只能运算数值形式,不能运算非数值形式
count:数量统计,此列共有多少有效值
unipue:不同的值有多少个
std:标准差
min:最小值
25%:四分之一分位数
50%:二分之一分位数
75%:四分之三分位数
max:最大值
mean:均值
#排序
可以用sort_index进行排序,axis可以有两种值,等于1的话就是对列进行操作,等于0的话就是对行进行操作。
ascending是升序的意思,ascending=False说明将列按照降序进行排列。
我们不仅可以用index进行排列,还可以根据实际数据进行排序。比如我要对E进行排序
2、选择数据
现在建立一个二维表格
如果我现在要选择A这一列的数据,可以这样:
我们也可以用loc标签来选择数据:
如果我需要提取2020年4月20号的数据,可以
print(df.loc['20200420'])
也就是将年份为20210420这行数据打印出来。
iloc标签:通过位置来选择
如果我要打印第三行的数据:(索引的第3行,实际位置是第4行)
如果我要打印第三行,第一列的数据:
如果我要打印第三行到第五行,第1列到第3列的数据
如果我要打印第1,3,5行,第1到3列的数据
3、pandas设置值,修改值
还是这个数据集
dates=pd.date_range('20210420',periods=6)
df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])
现在我想把索引值的第2行第3列改成123
如下:
如果我要将横向标签为20210420的B栏改成111的话,可以这样:
如果我要将A列所有大于4的行,全部置为0,可以用以下办法:
如果我要插入两列E,F,并将其值置为空:
4、处理丢失数据
现在假装有丢失数据,我人为的将索引序列的第0行第1列,第1行第2列置为空。
我现在要处理这些不完整数据:
- 如果我要这个丢失数据所在的整个行数据丢掉
其中,axis=0代表行,axis=1代表列。
how=‘any’,意思是只要此行里面任意一个数据为空,就删除这个行。
how=‘all’,意思是需要此行数据里面所有的数据为空,才删除这个行。
如果我现在要填充这些空值:
如果我要检查这个二维表格中是否有缺失值,哪些是缺失的
5、导入导出数据
假如有一个csv文件名为"lover.csv",要将其导入进pandas,只需要加上这样的代码:
import pandas as pd
pd=pd.read_csv('lover.csv')
6、合并多个DataFrame
#concat
先创建几个DataFrame
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3=pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
print(df1)
print(df2)
print(df3)
运行结果为:
我们现在将其合并
res=pd.concat([df1,df2,df3],axis=0) #竖向合并
我们发现,最前面的索引是012-012-012,如果我要忽略这个索引,重新建立索引,可以用这个语句:
res=pd.concat([df1,df2,df3],axis=0,ignore_index=True)
#join,[‘inner’,‘outer’]
如果两个DataFrame的横向索引不一样,如下图所示:
如果直接用concat合并的话:
即没有的数据会用NAN填充,这种连接方式就是join的outer连接。
而inner连接会将两个DataFrame的相同索引连接起来,互相没有的索引会将其裁减掉:
如果我要横向合并,那当然是要把axis置为1,但是横向的索引不一样,所以此时我们可以让其遵守其中某一个DataFrame的索引
如果没有加入join_axes这串代码,那合并后的横向索引就是1 2 3 4
#merge
我现在创建两个DataFrame:
如果我要将这两个DataFrame用love这个列相连接,可以用merge
res=pd.merge(df1,df2,on='love')
merge连接默认的是inner
7、数据可视化
#Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data=pd.Series(np.random.randn(1000),index=np.arange(1000)) #随机生成1000个数
data=data.cumsum() #将这1000个数据进行累加
data.plot()
plt.show()
运行结果如下:
#DataFrame
data=pd.DataFrame(np.random.randn(1000,4),
index=np.arange(1000),
columns=list('ABCD'))
data=data.cumsum()
data.plot()
plot methods:
- bar
- hist
- box
- kde
- area
- scatter
比如scatter只能有两条属性,一个X一个Y
data=pd.DataFrame(np.random.randn(1000,4),
index=np.arange(1000),
columns=list('ABCD'))
data=data.cumsum()
ax=data.plot.scatter(x='A',y='B',color='SkyBlue',label='Class 1')
data.plot.scatter(x='A',y='C',color='Green',label='Class 2',ax=ax)
plt.show()
基础先介绍到这里啦,对于数据可视化的部分,会专门写一个博文。大家互相学习,一起加油