一、pandas中的Series模块
Series 是一个类似数组的数据结构
- 可以把Series看成一个定长的有序字典
可以通过shape,size,index,values等得到series的属性 - 可以通过head(),tail()快速查看Series对象的样式
- 当索引没有对应的值时,可能出现缺失数据显示NaN(not a number)的情况
- 可以使用pd.isnull(),pd.notnull(),或自带isnull(),notnull()函数检测缺失数据
- Series对象本身及其索引都有一个name属性
Series的创建
由列表或numpy数组创建
默认索引为0到N-1的整数型索引
obj = Series([1,2,3,4])
print(obj)
输出:
0 1
1 2
2 3
3 4
dtype: int64
#还可以通过设置index参数指定索引
obj2 = Series([1,2,3,4],index=['a','b','c','d'])
obj2
输出:
a 1
b 2
c 3
d 4
dtype: int64
特别地,由ndarray创建的是引用,而不是副本。对Series元素的改变也会改变原来的ndarray对象中的元素。(列表没有这种情况)
a = np.array([1,2,3])
obj = Series(a)
obj
输出:
0 1
1 2
2 3
dtype: int64
obj[0]=0
print(a)
print(obj)
输出:
[0 2 3]
0 0
1 2
2 3
dtype: int64
用字典进行创建
obj = Series({'a':1,'b':2})
obj
输出:
a 1
b 2
dtype: int
Series的索引和切片
- (1) 显式索引:
- 使用index中的元素作为索引值
- 使用.loc[](推荐)
注意,此时是闭区间
- (2) 隐式索引:
- 使用整数作为索引值
- 使用.iloc[](推荐)
注意,此时是半开区间
Series的运算
- 适用于numpy的数组运算也适用于Series
- Series之间的运算 在运算中自动对齐不同索引的数据 如果索引不对应,则补NaN
二、pandas中的 DataFrame模块
- DataFrame的创建
最常用的方法是传递一个字典来创建。DataFrame以字典的键作为每一【列】的名称,
以字典的值(一个数组)作为每一列。
此外,DataFrame会自动加上每一行的索引(和Series一样)。
同Series一样,若传入的列与字典的键不匹配,则相应的值为NaN。
- DataFrame的索引
- 对列进行索引
通过类似属性的方式
例如:frame.name这样子
通过类似字典的方式
例如:frame['name']
- 对行进行索引
使用.ix[]来进行行索引
使用.loc[]加index来进行行索引
使用.iloc[]加整数来进行行索引
- 对元素进行索引
- 先使用列索引
- 先使用行索引
- 使用values属性(二维numpy数组)
注意:
直接用中括号时:
索引表示的是列索引
切片表示的是行切片
- DataFrame的运算
DataFrame之间的运算
Series与DataFrame之间的运算
axis=0:以列为单位操作(参数必须是列),对所有列都有效。
axis=1:以行为单位操作(参数必须是行),对所有列都有效。
三、pandas层次化索引
- 创建多层索引
- 隐式构造
Series也可以创建多层索引
- 显示构造MultiIndex
使用数组的方式 Mindex = pd.MultiIndex.from_arrays([['a','a','b','b'],[1,2,1,2]])
使用tuple Mindex = pd.MultiIndex.from_tuples([('a',1),('a',2),('b',1),('b',2)])
- 多层列索引
除了行索引index,列索引columns也能用同样的方法创建多层索引
a = np.random.randint(0,150,(2,8))
Mindex = pd.MultiIndex.from_product([['语文','数学','英语','理综'],['期中','期末']])
ddd = DataFrame(data = a,index = ['张三','李四'],columns = Mindex)
- 多层索引对象的索引和切片操作
Series的操作
【重要】对于Series来说,直接中括号[]与使用.loc()完全一样,因此,推荐使用中括号索引和切片
- 索引 pop['California']
- 切片 pop['California':'New York']
pop[::-1]
pop[:,2010]
DataFrame的操作
- 可以直接使用列名称来进行列索引
- 使用行索引需要用ix(),loc()等函数 【极其重要】推荐使用loc()函数
- 注意在对行索引的时候,若一级行索引还有多个,对二级行索引会遇到问题!也就是说,无法直接对二级索引进行索引,必须让二级索引变成一级索引后才能对其进行索引!
- 索引的堆
- unstack()
【小技巧】使用unstack()的时候,level等于哪一个,哪一个就消失,出现在列里
- 聚合操作
【注意】
需要指定level
【小技巧】和unstack()相反,聚合的时候,level等于哪一个,哪一个就保留
四、pandas拼接操作
- 级联:pd.concat, pd.append
- numpy 的级联
np.concatenate([x,y,z])
- 创建生成DataFrame的函数
创建生成DataFrame的函数
- 使用pd.concat()级联
display(df1,df2,pd.concat([df1,df2]))
- 使用pd.appnd()级联
x = make_df('AB',np.random.randint(10,size = 2))
y = make_df('AB',np.random.randint(10,20,size = 2))
display(x.append(y))
- 合并:使用pd.merge()
- 一对一合并
df3 = pd.merge(df1,df2)
- 多对一合并
df3 = DataFrame({
'employee':['Lisa','Jake'],
'group':['Accounting','Engineering'],
'hire_date':[2004,2016]})
df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
'supervisor':['Carly','Guido','Steve']
})
display(df3,df4,pd.merge(df3,df4))
- 多对多合并
df1 = DataFrame({'employee':['Bob','Jake','Lisa'],
'group':['Accounting','Engineering','Engineering']})
df5 = DataFrame({'group':['Engineering','Engineering','HR'],
'supervisor':['Carly','Guido','Steve']
})
display(df1,df5,pd.merge(df1,df5))#多对多
display(pd.concat([df1,df5]))
- key的规范化
使用on=显式指定哪一列为key
使用left_on和right_on指定左右两边的列作为key
- 内合并与外合并
内合并:只保留两者都有的key(默认模式)
外合并 how='outer':补NaN
左合并、右合并:how='left',how='right'
- 列冲突的解决
当列冲突时,即有多个列名称相同时,需要使用on=来指定哪一个列作为key
五、pandas数据处理
- 删除重复元素
df = DataFrame({'color':['white','white','red','red','white'],
'value':[2,1,3,3,2]})
display(df,df.duplicated(),df.drop_duplicates())
- 映射
- replace()函数:替换元素
- map()函数:新建一列 !!!map中返回的数据是一个具体值,不能迭代
- rename()函数:替换索引
- 异常值检测和过滤
- 使用describe()函数查看每一列的描述性统计量
- 使用std()函数可以求得DataFrame对象每一列的标准差
- 根据每一列的标准差,对DataFrame元素进行过滤。借助any()函数,对每一列应用筛选条件
- 排序
- 使用.take()函数排序
可以借助np.random.permutation()函数随机排序
- 随机抽样
当DataFrame规模足够大时,直接使用np.random.randint()函数,就配合take()函数实现随机抽样
- 数据聚合【重点】
数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
数据分类处理:
分组:先把数据分为几组
用函数处理:为不同组的数据应用不同的函数以转换数据
合并:把不同组得到的结果合并起来
数据分类处理的核心: groupby()函数
- 数据分类处理的核心: groupby()函数
df = DataFrame({'color':['white','red','green','red'],
'item':['ball','mug','pen','pencil'],
'price1':np.random.rand(4),
'price2':np.random.rand(4)})
g = df.groupby('color')['price1']
display(df,g,g.groups,type(g))
display(g.sum(),g.mean(),g.max())
- 高级数据聚合
- 可以使用pd.merge()函数包聚合操作的计算结果添加到df的每一行
- 可以使用transform和apply实现相同功能