(数据科学学习手札06)Python在数据框操作上的总结(初级篇)
数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作。
Python
本文涉及Python数据框,为了更好的视觉效果,使用jupyter notebook作为演示的编辑器;Python中的数据框相关功能集成在数据分析相关包pandas中,下面对一些常用的关于数据框的知识进行说明:
1.数据框的创建
import pandas as pd
from numpy import random
a = [i for i in range(10)]
b = [random.randint(1,10) for i in range(10)]
c = ['a','b','c','d','e','f','g','h','i','j']
data = pd.DataFrame({'a':a,'b':b,'c':c})
data

pd.DataFrame()中的常用参数:
data:可接受numpy中的ndarray,标准的字典,dataframe,其中,字典的值可以为Series,arrays,常数或列表
index:数据框行的索引值,默认为0,1,...,到length(数据框)
columns:数据框列的标签,可用于索引数据框,默认同index
dtype:强制数据框内数据转向的数据类型,如(float64)
copy:是否对输入的数据采取复制的方法生成数据框
2.数据框内容的索引
方式1:
直接通过列的名称调取数据框的中列
data['c'][2]

data['a']

data['c'][2:]

方式2:
loc[]:通过行标签调用数据内容
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
mydata = pd.DataFrame(data,index=index,columns=columns)
mydata.loc['a']

iloc[]:通过行列序号调取内容
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
mydata = pd.DataFrame(data,index=index,columns=columns)
mydata.iloc[1]

mydata.iloc[0:2]

mydata.iloc[0,2]

3.数据框的拼接操作
pd.concat()方法:
pd.cancat()的相关参数:
objs:要进行拼接的数据框名称构成的列表,如[dataframe1,dataframe2]
axis:按行向下拼接(0)还是按列向右拼接(1),默认0
ingore_index:axis所在方向上标签在合并后是否重置,默认False
keys:是否对拼接的几个素材数据框进行二级标号(即在每部分子数据框拼接开始处创建外层标签)
按列拼接数据框:
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
mydata = pd.DataFrame(data,index=index,columns=columns)
pd.concat([mydata,mydata],axis=1,keys=['',''])

按行拼接数据框且重置行标号:
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
mydata = pd.DataFrame(data,index=index,columns=columns)
pd.concat([mydata,mydata],axis=0,ignore_index=True)

df.append()方法
与列表append()不同,这里的append是用来上下拼接数据框:
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
mydata = pd.DataFrame(data,index=index,columns=columns)
mydata.append([mydata,mydata])

append()也有参数ignore_index
data = [[1,2,3],[4,5,6]]
index = ['a','b']
columns = ['A','B','C']
mydata = pd.DataFrame(data,index=index,columns=columns)
mydata.append([mydata,mydata],ignore_index=True)

4.数据框的合并操作
pd.merge()
参数介绍:
left:第一个数据框对象
right:第二个数据框对象
how:连接方式,包括‘left’,'right','inner','outer',默认为'inner'
on:两个数据框共同拥有的一列,作为连接键;若不传参数,且left_index与right_index都等于False,则自动识别两个数据框同名的列作为联结键
left_index:为True时,以左侧数据框的行标签作为联结键
right_index:为True时,以右侧数据框的行标签作为联结键
sort:为True时,在合并之后以联结键为排序依据进行排序
suffixes:一个元组,储存对两个数据框中重复非联结键列进行重命名的后缀,默认为('_x','_y')
indicator:是否生成一列新值_merge,来为合并后的每行标记其中的数据来源,有left_only,right_only,both三种可能
ID = ['','','','']
A = ['A1','A2','A3','A4']
B = ['B1','B2','B3','B4']
C = ['C1','C2','C3','C4']
D = ['D1','D2','D3','D4']
df1 = pd.DataFrame({'ID':ID,
'A':A,
'B':B})
df2 = pd.DataFrame({'ID':ID,
'C':C,
'D':D})
pd.merge(left=df1,right=df2,on='ID')

当联结键所在列有互异的部分时:
ID = ['','','','']
A = ['A1','A2','A3','A4']
B = ['B1','B2','B3','B4']
C = ['C1','C2','C3','C4']
D = ['D1','D2','D3','D4']
df1 = pd.DataFrame({'ID':ID,
'A':A,
'B':B})
df2 = pd.DataFrame({'ID':['','','',''],
'C':C,
'D':D})
df1

df2

how='inner'时:
pd.merge(left=df1,right=df2,on='ID',how='inner')

how='outer'时:
pd.merge(left=df1,right=df2,on='ID',how='outer')

可以看出,当how=’inner‘时,得到的合并数据框会自动剔除存在数据缺失的行,只保留完美的行,'outer'时则相反
dataframe.join()
join()的一些常用参数:
other:join()的合并对象
on:指定的合并依据的联结键列
how:选择合并的方式,'left'表示左侧数据框行数不可改变,只能由右边适应左边;'right'与之相反;'inner'表示取两个数据框联结键列的交集作为合并后新数据框的行;'outer'表示以两个数据框联结键列的并作为新数据框的行数依据,缺失则填充缺省值
lsuffix:对左侧数据框重复列重命名的后缀名
rsuffix:对右侧数据框重复列重命名的后缀名
sort:表示是否以联结键所在列为排序依据对合并后的数据框进行排序,默认为False
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'D': ['D3', 'D4', 'D5']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
left

right

left.join(right,lsuffix='_left',rsuffix='_right')

left.join(right,on='D',rsuffix='_right',lsuffix='_left')

5.数据的重整
数据透视表是excel中一个很有名且很有用的功能,但是一旦excel中导入的数据集过于庞大,打开都废劲,更不用说生成数据透视表了,而这种时候Python中的与透视表相似的功能就非常有优势。
dataframe.pivot()
pivot()的一些参数:
index:字符串或对象,作为透视表的行标签
columns:字符串或对象,作为透视表的列标签
values:生成新数据框的值(即透视表的作用区域)
df = pd.DataFrame({'foo': ['one','one','one','two','two','two'] ,
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6]})
df

df.pivot(index='foo',columns='bar',values='baz')

数据框中有多列数值时:
df['baz_new'] = df['baz']*2
df

df.pivot(index='foo',columns='bar')

利用stack()与unstack()来重整数据(这两种方法互逆):
df2 = df.pivot(index='foo',columns='bar')
stacked = df2.stack()
stacked

stacked.unstack()

6.数据框的抽样筛选
利用df.sample()来对原数据框进行一定比例的随机抽取并打乱顺序,主要参数如下:
frac:返回的抽样行数占总行数的比例,若想进行全排列则设置为1
replace:采取放回还是不放回,默认不放回,即False
weights:根据axis的方向来定义该方向上的各行或列的入样概率,长度需与对应行或列的数目相等,当权重之和不为0时,会自动映射为和为1
a = [i for i in range(10)]
df = pd.DataFrame({'A':a,
'B':a,
'C':a})
df

df.sample(frac=1)

细心的你会发现虽然我们成功得到了一个数据框按行的随即全排列,但是每一行的行index却依然和打乱前对应的行保持一致,如果我们利用行标号进行遍历循环,那么实际得到的每行和打乱之前没什么区别,因此下面引入一个新的方法,确保数据框打乱顺序后行标号重置:
df.sample(frac=1).reset_index(drop=True)
这时我们得到的新的数据框的行index就进行了重置,于是我们就能愉快的进行遍历等操作啦~

对sample的其他参数进行设置:
A = [random.randint(1,10) for i in range(10)]
B = [random.randint(1,10) for i in range(10)]
C = [random.randint(1,10) for i in range(10)]
D = [random.randint(1,10) for i in range(10)]
df = pd.DataFrame({'A':A,
'B':B,
'C':C,
'D':D})
df

df.sample(n=3,axis=1,weights=[0.1,0.2,0.4,0.3])

除了使用pandas自带的sample方法,我们还可以使用机器学习相关包sklearn中的shuffle()方法:
from sklearn.utils import shuffle
a = [i for i in range(10)]
df = pd.DataFrame({'A':a,
'B':a,
'C':a})
shuffle(df).reset_index(drop=True)

7.数据框的条件筛选
在日常数据分析的工作中,经常会遇到要抽取具有某些限定条件的样本来进行分析,在SQL中我们可以使用Select语句来选择,而在pandas中,也有几种相类似的方法:
方法1:
A = [random.randint(1,10) for i in range(10)]
B = [random.randint(1,10) for i in range(10)]
ss = ['重庆','四川','安徽','山东']
Add = [random.choice(ss,1)[0] for i in range(10) ]
df = pd.DataFrame({'A':A,
'B':B,
'address':Add})
df

df[df['address'] == '四川']

还可以通过将多个条件用括号括起来并用逻辑符号连接以达到多条件筛选的目的:
df[(df['B']>=5)&(df['address'] == '重庆')]

方法2:
利用df.query()进行条件筛选:
df.query('A > 2 and address == {}'.format("'"+"安徽"+"'"))

8.数据框元素的去重
df.drop_duplicates()方法:
参数介绍:
subset:为选中的列进行去重,默认为所有列
keep:选择对重复元素的处理方式,'first'表示保留第一个,'last'表示最后一个,False表示全部删除
inplace:默认为False,即返回一个原数据框去重后的新数据框,True则返回原数据框去重后变更的数据框
df.drop_duplicates(subset='address')

9.分组与合计函数配合使用
分组方法df.groupby()一般与size(),count()等合计函数联合使用,以达到记录分组频数等功能:
A = [random.randint(1,10) for i in range(20)]
B = [random.randint(1,10) for i in range(20)]
ss = ['重庆','四川','安徽','山东']
Add = [random.choice(ss,1)[0] for i in range(20) ]
df = pd.DataFrame({'A':A,
'B':B,
'address':Add})
df

df.groupby('address').size()

df.groupby('address').count()

10.用类似SQL中as的方法来重命名columns
df.rename(columns={'A':'a','B':'b','address':'Address'})

11.数据框的排序
df.sort_values()方法对数据框进行排序:
参数介绍:
by:为接下来的排序指定一列数据作为排序依据,即其他列随着这列的排序而被动的移动
df#原数据框

df.sort_values(by='address')

12.缺失值的处理
常用的处理数据框中缺失值的方法如下:
df.dropna():删去含有缺失值的行
df.fillna():以自定义的方式填充数据框中的缺失位置,参数value控制往空缺位置填充的值,method控制插值的方式,默认为'ffill',即用上面最近的非缺省值来填充下面的缺失值位置
df.isnull():生成与原数据框形状相同的数据框,数据框中元素为判断每一个位置是否为缺失值返回的bool型变量
df.notnull():与isnull()方法返回的值相反
'''创造含有缺失值的数据框'''
import pandas as pd
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2'],
'D': ['D3', 'D4', 'D5']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
'D': ['D0', 'D2', 'D3']},
index=['K0', 'K2', 'K3'])
token = left.join(right,lsuffix='_left',rsuffix='_right')
token

token.dropna()

token.fillna(value=0)

token.fillna(method='ffill')

token.isnull()

token.notnull()

以上就是关于Python pandas数据框的基本操作,而对于更复杂的更自定义化的与SQL语言更接近的部分,我们之后会在进阶篇中提及。
(数据科学学习手札06)Python在数据框操作上的总结(初级篇)的更多相关文章
- (数据科学学习手札70)面向数据科学的Python多进程简介及应用
本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 进程是计算机系统中资源分配的最小单位,也是操作系 ...
- (数据科学学习手札32)Python中re模块的详细介绍
一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札80)用Python编写小工具下载OSM路网数据
本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- (数据科学学习手札55)利用ggthemr来美化ggplot2图像
一.简介 R中的ggplot2是一个非常强大灵活的数据可视化包,熟悉其绘图规则后便可以自由地生成各种可视化图像,但其默认的色彩和样式在很多时候难免有些过于朴素,本文将要介绍的ggthemr包专门针对原 ...
- (数据科学学习手札49)Scala中的模式匹配
一.简介 Scala中的模式匹配类似Java中的switch语句,且更加稳健,本文就将针对Scala中模式匹配的一些基本实例进行介绍: 二.Scala中的模式匹配 2.1 基本格式 Scala中模式匹 ...
随机推荐
- Windows远程桌面,出现身份验证错误,要求的函数不正确
升级windows10 1803后,mstsc远程桌面出现 mstsc 远程桌面要求的函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正.如图所示: 运行(win+r) gpedit ...
- EM自动任务导致数据库缓慢
这两天客户抱怨数据库慢,查看性能什么的没发现什么异常.查看job发现一个内容为EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS执行特别频繁.使用 EXEC DBMS_ ...
- Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用
1. 反射获取成员变量并且使用: (1)获取字节码文件对象: Class c = Class.forName("cn.itcast_01.Person"); (2) ...
- 【BZOJ3495】PA2010 Riddle
题目大意 有\(n\)个城镇被分成了\(k\)个郡,有\(m\)条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. 题目分析 每条边至少有一个端点是首都,每个郡至多 ...
- likelihood(似然) and likelihood function(似然函数)
知乎上关于似然的一个问题:https://www.zhihu.com/question/54082000 概率(密度)表达给定下样本随机向量的可能性,而似然表达了给定样本下参数(相对于另外的参数)为真 ...
- 【洛谷P1886】滑动窗口
滑动窗口 [题目描述] 有N个数字,以及一个大小为k的窗口.现在这个窗口从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 思路: k<=N<=1000000,暴 ...
- JavaScript面向对象编程之创建对象
参考资料依旧<JavaScript高级程序设计>,不得不说这本书写的太好了,讲的极为清晰凝练,好书! 先给出重点笔记,好好理解下面的三条笔记,每一句话都很重要: 1.实例的指针仅指向原型, ...
- android:TableLayout表格布局详解
http://blog.csdn.net/justoneroad/article/details/6835915 这篇博文包括的内容:1.TableLayout简介2.TableLayout行列数的确 ...
- RPC的应用(The lowest layer of RPC)
server端代码: #include <stdio.h>#include <rpc/rpc.h>#include <rpcsvc/rusers.h> void n ...
- CSS&JS定位器
一.CssSelector定位器 1.概述 CssSelector是效率很高的元素定位方法,Selenium官网的Document里极力推荐使用CSS locator,而不是XPath来定位元素,原因 ...