目录
1.导入pandas
2.pandas两个常用的工具数据结构——Series和Dataframe
2.1. Series
2.2. Dataframe
2.2.1 构建dataframe
2.2.2 Dataframe中的一列,可以按字典型标记或属性那样检索为Series;
2.2.3 将列表或数组赋值给一个列
2.2.4 删除一个列
2.2.5 返回Dataframe的values属性(以二维ndarray的形式返回)
2.2.6 索引对象
2.2.7 Series或者Dataframe的索引
2.2.8 使用loc和iloc选择数据
2.2.9 使用填充值的算数方法
2.2.10 Dataframe和Series间的操作
2.2.11 函数应用和映射
2.2.12 排序和排名
2.2.13 唯一值,计数和成员属性
pandas——进行数据清洗和分析(适合处理表格或异质型数据)
numpy——数值计算工具(适合处理同质型的数值类数组数据)
matplotlib——数据可视化工具
1.导入pandas
import pandas as pd
2.pandas两个常用的工具数据结构——Series和Dataframe
2.1. Series
2.1. Series
Series:一种一维的数组型对象,它包含了一个值序列,并包含了数据标签,称为索引(index)。
不为数据指定索引默认生成的索引是从0-N-1(N是数据的长度)
另一个角度将series考虑成长度固定且有序的字典。所以可以用已存在的字典生成一个series
2.1.1创建series
obj = pd.Series(range(3,10,2))
# 输出:
0 3
1 5
2 7
3 9
dtype: int64
sdata = {'Alice':80,'Bob':88,'Sherry':93}
# 根据已有字典生成一个series
new_sdata = pd.Series(sdata)
# 输出: Alice 80 Bob 88 Sherry 93 dtype: int64
2.1.2 取series的值values和索引index
obj.values obj.index
2.1.3 生成series用修改index将新的series以修改后的index顺序排序
names = ['Bob','Sherry','Alice'] new_sdata_names = pd.Series(sdata,index=names)
# 输出:
Bob 88 Sherry 93 Alice 80 dtype: int64
表示缺失数据:“缺失”或“NA”
(pandas中)检查缺失数据:isnull和notnull函数
new_names = ['Bob','Sherry','Alice','Nobody'] new_sdata_names2 = pd.Series(sdata,index=new_names)
# 输出
Bob 88.0 Sherry 93.0 Alice 80.0 Nobody NaN dtype: float64
pd.isnull(new_sdata_names2) # 检查是空的为True
# 输出
Bob False Sherry False Alice False Nobody True dtype: bool
pd.notnull(new_sdata_names2) # 检查不是空的为True
# 输出
Bob True Sherry True Alice True Nobody False dtype: bool
2.2. Dataframe
dataframe表示的是矩阵的数据表,包含已排序的列集合,每一列可以是不同的值类型。可被视为一个共享相同索引的series的字典。
2.2.1 构建dataframe
最常用的方式:利用包含等长度列表或numpy数组的字典来形成dataframe
产生的dataframe会自动为series分配索引,并且列会按照排序的顺序排列。
import pandas as pd
data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002,2003],
'pop':[1.5,1.7,3.6,24,2.9,3.2],
}
frame = pd.Dataframe(data)
# 输出
frame.head() # 只选出头部的五行
frame2 = pd.Dataframe(data,columns=['year','pop','state']) # Dataframe的列按照指定顺序排列
构建dataframe的第二种方式:包含字典的嵌套字典(将字典的键作为列,将内部字典的键作为行索引。)
pop = {'Nevada':{2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001:1.7,2002:3.6}
}
frame4 = pd.Dataframe(pop)
构建dataframe的第三种方式:包含series的字典
pdata = {'Ohio':frame4['Ohio'][:-1],
'Nevada':frame4['Nevada'][:2]
}
frame5 = pd.Dataframe(pdata)
2.2.2 Dataframe中的一列,可以按字典型标记或属性那样检索为Series;
frame3 = pd.Dataframe(data,columns=['year','pop','state','222haha'])
frame3.222haha
只在列名是有效的python变量名时有效
frame3['222haha']
对于任意列名均有效
2.2.3 将列表或数组赋值给一个列
值的长度必须和Dataframe的长度相匹配。
如果将series赋值给一列时,series的索引将会按照dataframe的索引重新排列,并在空缺的地方填充缺失值。
c = pd.Series([1,5,8],index=[0,5,3]) frame3['222haha']=c
如果被赋值的列并不存在,则会生成一个新的列
frame3['new_colum'] = frame3['state'] == 'Ohio'
2.2.4 删除一个列
del frame3['new_colum']
注意:从Dataframe中选取的列是数据的视图,而不是拷贝。因此,对Series的修改会映射到Dataframe中。如果需要复制,则应当显式地使用Series的copy方法。
很多函数,如drop,会修改Series或者Dataframe的尺寸或者形状,这些方法直接操作原对象而不返回新对象。
data = pd.Dataframe(np.arange(16).reshape(4,4),
index = ['Ohio','Colorado','Utah','New York'],
columns = ['one','two','three','four']
)
data.drop('Ohio')
但是,此时
要清除被删除的数据,需要加入inplace属性
只能执行一次,不然会报错,因为删掉后已经没这行(列)了。
2.2.5 返回Dataframe的values属性(以二维ndarray的形式返回)
frame4.values
如果Dataframe的列是不同的dtypes,则values的dtype会自动选择适合所有列的类型
2.2.6 索引对象
索引对象是不可变的,用户是无法修改索引对象的。
重建索引——用reindex创建一个符合新索引的新对象。
obj = pd.Series([4,5,6])
new_obj = obj.reindex(['a','b','c'])
new_obj = obj.reindex([2,'b',0])
注意:
1.调用reindex方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在,则会引入缺失值。所以不是简单的按顺序把原series的index重新改变了。
2.索引对象是不可变的,用户是无法修改索引对象的,调用reindex方法也并没有修改原Dataframe,调用reindex方法后如果不返回赋值一个新的变量,那么在此基础上做些操作可能会出错。
ab = ['a','b','d'] f=frame.reindex(columns=ab) f.loc[[1,2],ab]
2.2.7 Series或者Dataframe的索引
# 根据 index
# 根据 序号
普通的python切片是不包含尾部的,Series的切片与之不同
使用这些方法可设值修改Series的相应部分
# 单取一列
# 取用列表排序想要的index
# 用index序号来索引
# 用布尔值数组切片或选择数据
# 选择数据将其赋值
2.2.8 使用loc和iloc选择数据
使用轴标签(loc)或整数标签(iloc)以Numpy风格的语法从Dataframe中选出数组的行和列的子集。
除了单个标签或者标签列表外,索引功能也可以用于切片
ix索引依然存在,但不推荐,推荐使用严格的基于标签的索引的loc和基于整数的索引的iloc。
注意:Dataframe的切片或者说索引(某数,不是某列)一定要用df.loc[]或df.iloc[],没有df[]这种写法(df[列名]可以取某列),series有s[]的写法取某数.
2.2.9 使用填充值的算数方法
为什么要酱紫?
想要实现类似于索引标签的自动外连接,没有交叠的标签位置上,内部数据对齐会产生缺失值。
可以看到哪怕df2的e列有数据,但是在df1+df2合并后形成的表是没有值的。
也就是将这些df添加到一起会导致在一些不重叠的位置出现NA值。
即是说在进行四则运算的时候由于Dataframe之间可能存在行列索引不能对齐的情况,这样计算得到的结果会出现空值,所以我们需要对空值进行处理。
我们可以在进行计算的时候通过传入fill_value进行填充,另外直接使用运算符进行运算是没办法传递参数进行填充的饿,所以我们需要使用Dateframe中为我们提供的算数方法,add/sub/div等。
若在算除法的过程当中发生了除零,得到了一个inf,它表示无穷大。
radd/rsub前面加个r是用来翻转参数的。
若我们希望得到Dataframe中所有元素的倒数,我们可以写成1/df,但1本身并不是一个Dataframe,所以我们不能用1来呼叫Dataframe中的方法,也就不能传递参数,为了解决这种情况,我们可以把1/df写成df.rdiv(1)
2.2.10 Dataframe和Series间的操作
广播机制:当我们从arr中减去arr[0]时,减法在每一行都进行了操作
Dataframe 和Series间的算术操作和Numpy中不同维度数组间的操作类似。
默认Dataframe和Series的数学操作中会将Series的索引和Dataframe的列进行匹配,并广播到各行。如果一个索引值不在Dataframe的列中,也不在Series的索引中,则对象会重建索引并形成联合。
如果想改成在列上广播,在行上进行匹配,必须使用算术方法中的一种。
2.2.11 函数应用和映射
Numpy的通用函数(逐元素数组方法)对pandas对象也有效。
# 生成数值符合正太分布的4行3列的数组
frame = pd.Dataframe(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
Dataframe的apply方法可将函数应用到一行或一列的一维数组上。
注意:默认是从axis=0,也就是列
传递给apply的函数不一定要返回一个标量值,也可以返回带有多个值的Series
def f(x):
return pd.Series([x.min(),x.max()],index = ['min','max'])
frame.apply(f)
逐元素调用函数的时候用applymap方法。
假如想要根据frame中的每个浮点数计算一个格式化字符串,可以使用applymap方法。
如果用apply,则报错
使用applymap作为函数名是因为Series有map方法,可以将一个逐元素的函数应用到Series上。
2.2.12 排序和排名
sort_index()方法:按行或按列索引进行字典型排序,该方法返回一个新的,排序好的对象。
数据默认会升序排序,但是也可以按照降序排序
也可用sort_values()方法根据Series的值进行排序,默认情况下,所有的缺失值会被排序到Series的尾部。
使用多列作为排序键,即传递多个列名给sort_values的可选参数by
Series和Dataframe的rank()方法:实现排名,当有平级情况时,取它们的平均排名
例如4排第4和第5,则它们的平均等级为(4+5)/2=4.5
但这种就有可能出现小数,
当出现同样的数字的时候,我们按先看到谁谁就是老大的原则,也就是排名根据他们在数据中的观察顺序进行分配。rank(method = "first")
ascending=False #降序排列
method="max" #将排名最大的赋值给值
Dataframe可以对行或列计算排名
skipna=True #有缺失值也会计算结果
默认为True
idxmax() 或者idxmin() 返回的是间接统计信息。
除归约方法外,有的方法是积累型方法:
如cumsum()
2.2.13 唯一值,计数和成员属性
一维Series包含的数值可能是重复的,unique()方法会给出Series中的唯一值。
value_counts()方法计算Series包含的值的个数,返回的Series会按照数量降序排列。可设置sort=False不排序返回
isin()方法执行向量化的成员属性检查
还可以将数据集以Series或者Dataframe一列的形式过滤为数据集的值子集。
与isin相关的Index.get_indexer()方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组:
当我们想要计算Dataframe多个相关列的直方图,可以将函数传入Dataframe的apply函数可得到。
例如将pandas.value_counts传入可得到所有列中出现的值它们分别在每列中出现的次数。
结果中的行标签是所有列中出现的不同值,数值是这些值在每个列中出现的次数



