(2)Python数据分析-Pandas相关

本文是Pandas相关介绍,如果需要了解Numpy和Matplotlib的知识,可以看我写的另外两篇博客,如下:

(1)Python数据分析-Numpy相关

(3)Python数据分析-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'])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值