本文是Pandas相关介绍,如果需要了解Numpy和Matplotlib的知识,可以看我写的另外两篇博客,如下:
目录
Series
-
生成
s = pd.Series([1,2,3,4]) 默认每个数据的标签为0,1,2,3
s = pd.Series([1,2,3,4],index=[‘a’,‘b’,‘c’,‘d’]) 设置每个数据的标签为a,b,c,d
s = pd.Series({‘a’:1,‘b’:2,‘c’:3,‘d’:4}) -
s.index 查看索引名称
s.values 查看值的内容 -
选取某个元素
s[1]
s[‘b’] -
选取多个元素
s[0:2]
s[[‘a’,‘c’]] -
筛选元素
s[s>3] -
按值筛选元素
s[s.isin([0,2])] -
按是否空值筛选元素
s.isnull()
s.notnull() -
s.unique() 寻找series中不同的元素
-
s.value_counts() 寻找series中不同的元素,并显示每个元素的个数
DataFrame
生成
frame = pd.DataFrame(二维list,columns=['A', 'B','C','D'], index=['a','b','c','d'])
frame.index 获取frame所有行的名称
frame.columns 获取frame所有列的名称
frame.values 获取frame所有的值
数据抽取
frame.A frame['A'] frame[['A','B']] 获取某一列
frame.iloc[0] frame.loc['a'] frame[0:1] 获取某一行或某几行
frame['A'][0] frame['A']['a'] 获取某一个值,先列后行
处理
-
frame.index.name = ‘id’ frame.columns.name = ‘item’ 给行标题和列标题起个名字
-
frame[‘new’] = [20,21,22,23] 加入新的一列
-
frame.isin([3,6]) 筛选函数
-
del frame[‘new’] 删除一列
-
frame.idxmin() frame.idxmax() 返回第一个和最后一个index的名称
-
frame.index.is_unique 判断frame中是否有重复index
-
frame.reindex([‘d’,‘c’,‘b’,‘a’]) 调整frame中行的位置
-
当index为默认数字时
frame.reindex(range(5), method=‘ffill’) 缺失值用前方的数值补齐
frame.reindex(range(5), method=‘bfill’) 缺失值用后方的数值补齐 -
删除一行或一列
frame.drop([‘a’,‘b’]) 删除一行
frame.drop([‘A’,‘B’],axis=1) 删除一列 -
加减乘除
+ - * / A.add(B) sub() mul() div()
-
对frame调用函数
frame.apply(func=, axis=0) axis:0-列,1-行
排序
(1)对索引进行排序
series.sort_index(ascending=False)
frame.sort_index(axis=) axis:0-index,1-columns
(2)对值进行排序
series.order()
frame.sort_values(by='B') frame.sort_values(by=['B','C'])
相关性和协方差
ser_1.corr(ser_2) 相关性
ser_1.cov(ser_2) 协方差
空值处理
删除空值
(1)Series
s.dropna()
s[s.notnull()]
(2)DataFrame
frame.dropna(how='all') 只将整行或整列均为NaN的部分去除
填充空值
frame.fillna(0) 给所有空值填上0
frame.fillna({'A':33, 'B':44, 'C':55}) 给每列的空值填上不同数值
等级索引
(1)Series
s = pd.Series(np.arange(5), index=[[‘A’,‘A’,‘B’,‘B’,‘C’], [‘a’,‘b’,‘a’,‘b’,‘a’]])
结果:
A a 0
b 1
B a 2
b 3
C a 4
-
s[‘A’] 选取第一列中某一索引项
s[:,‘a’] 选取第二列中某一索引项
s[‘A’,‘a’] 选取某一特定元素 -
s.unstack() 将第一列索引作为index,第二列索引作为columns,把Series转化为DataFrame
frame.stack() 将DataFrame转化为等级索引的Series
(2)DataFrame
frame = pd.DataFrame(np.arange(16).reshape(4,4),index=[['X','X','Y','Y'], ['A', 'B','C','D']], columns=[['a','a','b','b'],[1,2,1,2]])
frame.index.names = ['status','sign']
frame.columns.names = ['ind','rank']
结果:
ind a b
rank 1 2 1 2
status sign
X A 0 1 2 3
B 4 5 6 7
Y C 8 9 10 11
D 12 13 14 15
按层级统计数据:
- frame.sum(level=‘status’)
结果:
ind a b
rank 1 2 1 2
status
X 4 6 8 10
Y 20 22 24 26
- frame.sum(level=‘rank’,axis=1)
结果:
rank 1 2
status sign
X A 2 4
B 10 12
Y C 18 20
D 26 28
数据读取
(1)CSV文件
frame = pd.read_csv('test.csv') 以CSV格式读取CSV文件
frame = pd.read_table('test.csv',sep=',') 以文本格式读取CSV文件,分隔符为 ','
-
如果csv文件内没有表头:
pd.read_csv(‘test.csv’,header=None) 自动加上 0,1,2,3等表头
pd.read_csv(‘test.csv’,names=[‘A’,‘B’,‘C’,‘D’]) 加上 A,B,C,D 等表头 -
csv文件内有层级索引
pd.read_csv(‘test.csv’,index_col=[‘color’,‘status’]) color作为第一层级,status作为第二层级
(2)读取txt文件
使用通配符读取文件
\d 数字 \D 非数字字符 \s 空白字符 \S 非空白字符 \n 换行符 \t 制表符
pd.read_table('data.txt', sep='\s*') 适用于文件中数据由多个空格分隔
pd.read_table('data.txt', sep='\D*') 适用于文件中数字数据由多个英文字母分隔
pd.read_table('data.txt', skiprows=5) 跳过文件中的前五行,读取其后内容
pd.read_table('data.txt', skiprows=[0,1,3]) 跳过文件中的0,1,3行,读取其他内容
pd.read_table('data.txt', skiprows=[2],nrows=3) 跳过文件中的2行,其他部分读取3行
(3)excel文件
pd.read_excel('data.xls')
数据写入
-
frame.to_csv(‘test.csv’,index=False,header=False) 设置为False可以将index和columns隐藏,只将数据写入文件
-
frame.to_csv(‘test.csv’,na_rep=‘NaN’) 设置将空值替换为 ‘NaN’
-
frame.to_excel(‘data.xls’)
Pandas数据处理
合并 - merge()
拼接 - concat()
结合 - combine_first()
(1)合并
merge() 默认内连接,结果是由交叉操作得到的,即结果中的index需要在两个DF中都存在(类似取交集)
pd.merge(frame_1, frame_2, on='id') on 指定两个DFrame 按照哪一个共同名称列进行合并
pd.merge(frame_1, frame_2, left_on='id', right_on='sid')指定两个DFrame 分别按照哪一列进行合并
pd.merge(frame_1, frame_2, on='id', how='outer') 外连接,(类似取并集)
pd.merge(frame_1, frame_2, on='id', how='left') 左连接,以左侧DF为主
pd.merge(frame_1, frame_2, on='id', how='right') 右连接,以右侧DF为主
pd.merge(frame_1, frame_2, on=['id','brand']) 多个键连接
单纯按照行的顺序进行拼凑
pd.merge(frame_1, frame_2,left_index=True, right_index=True)
frame_1.join(frame_2)
(2)拼接
Series:
pd.concat([s_1,s_2]) 默认按照竖向拼接
pd.concat([s_1,s_2],keys=['one','two']) 竖向拼接,并且给index赋上第一层级的名称
pd.concat([s_1,s_2], axis=1) 按照横向拼接,且是外连接
pd.concat([s_1,s_2], axis=1,join='inner') 按照横向拼接,且是内连接
pd.concat([s_1,s_2], axis=1,keys=['one','two']) 横向外连接,并给columns赋上第一层级的名称
Pandas:
pd.concat([frame_1,frame_2]) 竖向拼接
pd.concat([frame_1,frame_2], axis=1) 横向拼接
(3)组合
s_1.combine_first(s_2) 取并集,遇到相同索引项时以s_1为准
s_1[:3].combine_first(s_2[:3]) 对Series的一部分进行组合
按等级索引进行旋转
s.unstack() 将第一列索引作为index,第二列索引作为columns,把Series转化为DataFrame
s.unstack(0) 将第一列索引作为columns,第二列索引作为index,把Series转化为DataFrame
frame.stack() 将DataFrame转化为等级索引的Series
将长格式转化为短格式:
color item value
white ball 1
color pen 3.2
white ball 2
color pen 3.5
white ball 1.6
frame.pivot('color', 'item') 将color作为index,item作为columns,形成新的DF
Pandas数据转换
删除重复元素
frame.duplicated() 返回Bool值,如果该行的ind和val 不是第一次出现,为False
frame[frame.drop_duplicates()] 只保留出现一次的ind和val
替换某个元素
map = {旧值:新值}
frame.replace(map)
frame.reindex(np.NaN,0)
添加某一列
price = {'ball':5,'mug':9} 建立好 item 到 price 的字典映射
print['new'] = print['item'].map(price)
修改index和column的名字
reindex = {1:'one', 2:'two', 3:'three'}
frame.rename(index=reindex)
frame.rename(columns=reindex)
Pandas数据划分
bins = [0,25,50,75,100]
bin_name = ['one','two','three','four','five']
res = pd.cut(frame, bins=bins, labels=bin_name) 返回结果是字符串数组,表示该数据属于哪个部分
res.levels 一共有哪几种类型
res.labels 每个数据的类型
pd.value_counts(res) 查看每种类型的数目
pd.cut(frame,5) 将数据分为五份
pd.qcut(frame,5) 将数据分为五份,并保证每份里面数据总数相同
异常值过滤
frame.any() 某一列任何一个为True,则返回True
frame.any(1) 某一行任何一个为True,则返回True
frame[ (frame > (3 * frame.std()) ).any(1)] 某一行中有大于3倍std的值时,将该行筛选出来
指定顺序
frame.take([2,1,5,3,4]) 改变行的顺序
frame.take([2,5]) 按顺序抽取某几行
正则表达式(regex)
import re
re.split('\s+',str) 以一个或多个空格为分隔符,分割字符串
re.findall('A\w+', str) 找到字符串中全部以A开头的单词
re.findall('[A,a]\w+', str) 找到字符串中全部以A开头的单词
search = re.search('[A,a]\w+', str) 寻找第一个匹配的子串,得到search.start()、search.end() 表示子串的起止位置
mat = re.match('[A,a]\w+', str) 从第一个字符开始寻找第一个匹配的子串,得到mat.start()、mat.end() 表示子串的起止位置,如果第一个字符就不同则停止
数据聚合:
color object price1 price2
0 white pen 5.56 100
1 red pencil 4.20 56
2 green pencil 1.30 85
3 red ashtray 6.80 45
4 green pen 1.90 95
处理
group = frame['price1'].groupby(frame['color']) 将price1按照color的不同分为几组
group.mean() group.sum() 分别对每组进行操作
group = frame['price1'].groupby([frame['color'],frame['object']] ) 将price1按照color和object的不同分为几组
group = frame[['price1','price2']].groupby(frame['color']) 分别将price1和price2按照color的不同分为几组
组迭代
for name,group in frame.groupby('color'):
print(name) 输出当前color的名字
print(group) 输出本组内的DF
聚合函数调用
group['price1'].agg('mean')
group['price1'].agg(['mean', 'std','sum'])