大家好,这次继续python另外一个包的学习~pandas
1.pandas Series操作
首先让我们重新在jupyter notebook中导入各种包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
这里简单提一下,matplotlib和seaborn两个包都是我们接下来会用到的包,是用来画图的,所以在这里我们导入它们
好了,那我们开始利用pandas建立Series吧
# np.nan 代表空值
# pandas 给数据添加了标号
s1=pd.Series([1,2,3,4,np.nan,5,6,7])
s1
输出:
0 1.0
1 2.0
2 3.0
3 4.0
4 NaN
5 5.0
6 6.0
7 7.0
dtype: float64
我们可以看到,和numpy稍有不同的是,pandas会给数据元素添加一个标号,并且我们可以给pandas的元素赋予空值。
不过可以通过s1.values 读取Series的值,会发现其实就是一个array
s1.values
输出:
array([ 1., 2., 3., 4., nan, 5., 6., 7.])
我们也可以读取pandas所建立的Series的标号,我们称之为index
# 读取的是values的标号
s1.index
输出:
RangeIndex(start=0, stop=8, step=1)
我们也可以自主的给index赋值
# 同样可以直接给index赋值
s2=pd.Series([21,23,24,25,27],index=['Jack','Lucy','John','Tina','Alex'])
s2
输出:
Jack 21
Lucy 23
John 24
Tina 25
Alex 27
dtype: int64
当然也可以利用python当中切片的特性来读取某一个或几个特定元素
s2['Jack']
输出:
21
也可以用 iloc的方式给出特定位置。 iloc可以理解为 index location
# 用iloc可以给出位置
s2.iloc[0]
输出:
21
可以用head()看Series的前几列
# 选择s2的前两行
s2.head(2)
输出:
Jack 21
Lucy 23
dtype: int64
describe()可以描述该Series的具体信息(very powerful!)
# describe直接返回该Series的很多数据结果
s2.describe()
输出:
count 5.000000
mean 24.000000
std 2.236068
min 21.000000
25% 23.000000
50% 24.000000
75% 25.000000
max 27.000000
dtype: float64
对数值进行大小排序
# 对values 进行大小排序
s2.sort_values()
输出:
Jack 21
Lucy 23
John 24
Tina 25
Alex 27
dtype: int64
我们得到了这个数据后,也可以简单的用plot()来画出它的柱状图
# 画出柱状图
s2.plot.bar()
输出:
pandas 还可以将Series转化成python 原来的字典形式
# 可以利用to_dict()将Series转化成字典形式
s2_dict=s2.to_dict()
s2_dict
输出:
{'Jack': 21, 'Lucy': 23, 'John': 24, 'Tina': 25, 'Alex': 27}
当然也可以转化回去,从字典变成Series
s2_series=pd.Series(s2_dict)
s2_series
输出:
Jack 21
Lucy 23
John 24
Tina 25
Alex 27
dtype: int64
再看一个简单的例子
name=['Jack','Lucy','John','Julia','Tina','Alex','Lucy']
# 更新index,可以添加之前没有index,例如julia,values会自动填充为NaN
# 此处,Lucy名字重复两次,values的值是一样的
s2_new=pd.Series(s2_dict,index=name)
s2_new
输出:
Jack 21.0
Lucy 23.0
John 24.0
Julia NaN
Tina 25.0
Alex 27.0
Lucy 23.0
dtype: float64
可以用 isnull() 判断是否为空值
# 判断是否为空值
pd.isnull(s2_new)
输出:
Jack False
Lucy False
John False
Julia True
Tina False
Alex False
Lucy False
dtype: bool
2.DataFrame
第二部分稍微进阶一丢丢~DataFrame类似于创建出一个表格
# 创建一个DataFrame
df=pd.DataFrame({'Student_1':[90,100,95],'Student_2':[60,80,90]},index=['Monday','Wednesday','Friday'])
df
输出:
和刚才一样,我们可以自己定义表格index和columns,index是纵向标题,columns是横向标题
# 也可以单独列写横行的标题,记作columns
df1=pd.DataFrame([[1,2,3],[4,5,6]],index=['A','B'],columns=['C1','C2','C3'])
df1
输出:
相应的我们也可以读取它的很多数据和属性
# 可以读取df1这个DataFrame的值
df1.values
输出:
array([[1, 2, 3],
[4, 5, 6]], dtype=int64)
读取它的index或者columns都可以
# 行的标号
df1.columns
输出:
Index(['C1', 'C2', 'C3'], dtype='object')
之前很多的操作在这里都可以重复实现,比如转置矩阵,shape(), size(),head()等函数都可以使用
比如
# 用describe()来添加对df1的每一列描述
df1.describe()
输出:
再次利用 loc函数
# 利用loc给出‘B’,给出的是B这一行的元素的信息
df1.loc['B']
输出:
C1 4
C2 5
C3 6
Name: B, dtype: int64
指定特定位置的元素
# 选取指定行列的元素
df1.loc['B']['C2']
输出:
5
可以直接对df1进行元素的加减
df1+10*15
输出:
然后介绍lambda函数
# 修改C2这一列的数值
# apply()意思是实施
# lambda 可以重新对x进行赋值
df1['C2']=df1.apply(lambda x: x['C2']**2+10, axis=1)
df1
输出:
以及更为复杂的变换
# assign 用于赋值
# C2这一列的元素平方加10,
# C3这一列的元素乘以2再减10
# loc['A']选择A这一行的元素进行操作
# max()选择A这一行的其中最大值
# C2这行经过变化是206
# C1这行还是1
# C3这行经过变化是-4
# 所以最大值输出为206
df1.assign(C2=lambda x:x['C2']**2+10,
C3=lambda x:x['C3']*2-10).loc['A'].max()
输出:
206
下一节将会用实际例子来介绍更为复杂pandas操作,谢谢~