python数据挖掘包Pandas基本操作
来源:互联网 发布:淘宝网旅游帐篷 编辑:程序博客网 时间:2024/06/14 06:53
原文博客:https://zhuanlan.zhihu.com/p/25013519
官网: http://pandas.pydata.org/pandas-docs/stable/
Pandas安装和使用
安装方式与python安装库方式一样:pip install -U pandas (-U表示安装最新版本)
注意:要先安装numpy,因为pandas会用到此库
安装过程的问题,具体问题具体百度解决
python数据结构
一般将pandas简称为pd:import pandas as pd
一、 Series
>>> pd.Series([5,4])0 51 4dtype: int64
说明:pandas中数据类型会具体涉及到int32、int64等。默认为64位,也可自行修改。
Series可理解为一个一维数组,只是index可以自己设置
* 创建方法
创建方法统一为:pd.Series(data,index=)
Series可以通过三种形式创建:python的dict、numpy当中的ndarray(numpy中的基本数据结构)、具体某个数值。
1. dic
>>> dict_s = pd.Series({'a':1,'b':2,'d':3},index=['a','b','c','d'])>>> dict_sa 1b 2c NaNd 3dtype: float64
说明:
- 打印的时候按照index赋值顺序
- 当某个index对应值为空就是NaN(如上index=’c’时,值为NaN)、
- 即使index被赋值之后,绝对位置不会被覆盖。
2. numpy中的ndarray
>>> import numpy as np>>> np_s = pd.Series(np.random.randn(5),index=list('ABCDE'))>>> np_sA -1.057819B -0.370827C -0.985265D 0.997723E -0.751130dtype: float64
- 具体某个值
>>> s = pd.Series(5)>>> s0 5dtype: int64>>> s_li = pd.Series([5,4])>>> s_li0 51 4dtype: int64>>> s_lis = pd.Series(5,index=list('abcd'))>>> s_lisa 5b 5c 5d 5dtype: int64
说明:
- 不对index进行赋值时,默认从0开始
- 某个值的创建方法,保证每行数据精准性的话很麻烦,并且用起来会不小心把其他数据覆盖掉
注意:创建Series的时候要注意创建行数和索引数量匹配的问题,如下不匹配会报错
s_li_in = pd.Series([5,4],index=list(‘abcd’))
查询
使用s.values和s.index,分别查询值和索引
>>> s_li.valuesarray([5, 4])>>> s_li.indexInt64Index([0, 1], dtype='int64')
二、DataFrame
类似表格的数据类型: DataFrame可以理解为一个二维数组,index有两个维度,可更改
参数:
- data (方框内的数据): numpy ndarray (structured or homogeneous), dict, or DataFrame
- index(行索引索引) : Index or array-like
- columns (列索引): Index or array-like
- dtype(data的数据类型) : dtype, default None
统一创建形式:pd.DataFrame(data,columns=,index=)
Data的创建形式: 一维数据类型进行创建、二维ndarray创建、外部输入
* 一维数据类型创建(一维ndarray、列表、字典、Series等)
1. 将字典或Series组合成列表再进行创建
>>> dic = {'a':1,'b':2}>>> d = pd.Series([3,4,5],index=list('abc'))>>> pd.DataFrame([dic,d],columns=list('abcd')) a b c d0 1 2 NaN NaN1 3 4 5 NaN
说明:
- 字典和series组成两行,顺序是在[dic,d]设定
- data数据的具体值,对应每行具体类型的index对应值(第一行为:dic,其a列对应值为dic中a=1)
- columns值是由DataFrame内指定
2. 将两者放入字典中创建
>>> a = {'a':1,}>>> a = {'a':1,'b':2}>>> b = pd.Series([4,5,6],index=list('abc'))>>> data = {'one':a,'two':b}>>> pd.DataFrame(data,columns=['one','two','a','b']) one two a ba 1 4 NaN NaNb 2 5 NaN NaNc NaN 6 NaN NaN[3 rows x 4 columns]
说明:
- 很明显,这种方式将不同对象按列组合创建(第一种为行)
- 结果行名:对象的index
注意:两种方法都要注意列名匹配的问题
3. 数组和列表
列表或者一维的ndarray可以通过转化为Series或者字典进行创建,或者变为对应的二维的数据类型进行处理
* 二维数组
*外部输入
读取文件等手段,如csv、excel等文件:先读取一个文件对象(pd.read_xxx,xxx是对应的文件类型,常用有csv、excel、table等)的对象,然后再通过该对象创建DataFrame,但要注意columns列名的命名。
>>> csv = pd.read_csv('/home/huiqin/Desktop/pandas.csv')# 利用pd.read_csv数据已经是:class 'pandas.core.frame.DataFrame'>>> csv_data = pd.DataFrame(csv,columns=['a','b','c'])>>> csv_data.head() a b c0 1 2 31 2 3 42 3 4 53 4 5 64 5 6 7[5 rows x 3 columns]
- 三维与多维数组:Panel/PanelND
数据类型操作
一、Series操作
查看
简单来说就是通过索引查看:一种是通过index对应的标签;另一种就是通过绝对位置查看
1. 绝对位置: s[xxx] xxx: 可以是数字、列表或者表达式
>>> s[[4,3,1]]e 5d 5b 5dtype: float64>>> s[s>1]a 5b 5c 5d 5e 5dtype: float64>>> s[0]5.0
- 通过标签
>>> s['a']5.0>>> 'f' in sFalse>>> s.get('e')5.0>>> s.get('f',np.nan)nan
- 三种方式:s[‘a’]、’e’ in s、或者s.get(‘f’,np.nan)
- s[‘a’]:返回标签对应数值或者NaN
’e’ in s返回true/false
s.get(‘f’) 返回label对应的值,如果没有读取到就无返回值,加入np.nan参数可在没有读取到时返回NaN
运算
操作运算符: +、-、*、/、np.exp以及关系运算等运算符
>>> s-sa 0b 0c 0d 0e 0dtype: float64>>> s[1:]+s[:3]a NaNb 10c 10d NaNe NaNdtype: float64
两个Series运算是其中一个Series中每个index位置和另一个Series对应index位置进行算数运算;也可以选取部分进行运算,在选取部分运算的时候要注意只能运算index相同的部分,不重合的部分则是NaN
* 命名
创建的时候使用使用name参数,可以通过name方法进行查询
>>> s = pd.Series(np.random.randn(5),name='something')>>> s.name'something'
二、DataFrame操作
* 查询
DataFrame.head可以查询前几行的数据,默认为前五行;DataFrame.tail查看后几行书,默认为5行;DataFrame.describe查看全部数据
>>> csv_data.tail() a b c8 9 10 119 10 11 1210 11 12 1311 12 13 1412 13 14 15[5 rows x 3 columns]>>> csv_data.describe() a b ccount 13.00000 13.00000 13.00000mean 7.00000 8.00000 9.00000std 3.89444 3.89444 3.89444min 1.00000 2.00000 3.0000025% 4.00000 5.00000 6.0000050% 7.00000 8.00000 9.0000075% 10.00000 11.00000 12.00000max 13.00000 14.00000 15.00000[8 rows x 3 columns]
排序
df.sort_index(axis=,ascending=) axis为0/1的参数,表示按行/按列排序;ascending为boolean参数,False表示降序,True表示升序。
>>> csv_data.sort_index(axis=0,ascending=False) a b c12 13 14 1511 12 13 1410 11 12 139 10 11 128 9 10 117 8 9 106 7 8 95 6 7 84 5 6 73 4 5 62 3 4 51 2 3 40 1 2 3[13 rows x 3 columns]
删除
使用del或者pop(‘columns’)方法: pop由于弹出特定的列,会返回被弹出的列中的数值
注意:所有删除的方法都会改变原来DataFrame,而不是像其他方法一样内存当中新建一个DataFrame
>>> csv_data a b c0 1 2 31 2 3 42 3 4 53 4 5 6[13 rows x 3 columns]>>> del csv_data['a']>>> csv_data b c0 2 31 3 42 4 53 5 6[13 rows x 2 columns]>>> csv_data.pop('b')0 21 32 43 5
运算
运算:+、-、*、/、exp以及关系运算等,类似于Series,两个DataFrame运算是一个DataFrame每个位置的值和对应位置另一个DataFrame的值进行运算,DataFrame转置DataFrame.T。也可选取特定的columns参与运算
注意:*不是矩阵相乘(叉乘),矩阵计算是numpy.linalg
>>> csv_data.T 0 1 2 3 4 5 6 7 8 9 10 11 12c 3 4 5 6 7 8 9 10 11 12 13 14 15[1 rows x 13 columns]>>> csv['d']=csv['b']*csv['c']>>> csv a b c d0 1 2 3 61 2 3 4 122 3 4 5 203 4 5 6 30[13 rows x 4 columns]
修改与添加
1. 修改
利用=即可实现修改功能,同时可以在=右边加上赋值的范围,赋值号同样会改变原来DataFrame当中的数值
>>> csv['a']=1>>> csv a b c d0 1 2 3 61 1 3 4 122 1 4 5 203 1 5 6 30
- 添加
添加新的列 :改变DataFrame数据
首先肯定是重新创建一个新的DataFrame;
其二就是上述的赋值做法,给原来DataFrame当中的新列进行赋值
其三就是通过insert(loc, column, value, allow_duplicates=False)方法进行
通过DataFrame.assign对表格进行改动,该方法会返回改动后的DataFrame,但不是改动原来的DataFrame
使用loc、iloc等都可以添加新列
>>> csv.insert(1,'e',csv['a'])>>> csv a e b c d0 1 1 2 3 61 1 1 3 4 122 1 1 4 5 203 1 1 5 6 30[13 rows x 5 columns]
选择/切片
1. 直接按照行/列进行选择: 用columns选择列,用index选择行
注意:选择列的时候单次只能选择某一列的数据,不能同时选择多列;而使用index的时候一定要使用范围(类似于[1:2]),单独某个index会报错
>>> csv['a']0 11 12 13 1Name: a, dtype: int64>>> csv[:1] a e b c d0 1 1 2 3 6[1 rows x 5 columns]
- 使用loc方法,通过位置标签选择:ataFrame.loc[index:index,[‘columns’]]
注意:loc方法当中的columns可以选择多列,如果表示只按列选择的话index可以不填但是冒号(:)和逗号(,)一定要写
>>> csv.loc[:,['a','b']] a b0 1 21 1 32 1 43 1 5[13 rows x 2 columns]
- loc还能这么用:DataFrame.loc[index,[‘columns’]],这时的index为特定能够的label或值,这样用会返回一个Series。里面的index和columns都是唯一的,返回一个值。由于降维的问题,pandas会对精度进行转换
>>> ss2 = csv.loc[0,['a']]>>> type(ss2)<class 'pandas.core.series.Series'>
- 使用iloc方法,通过绝对位置选择
思路与loc方法基本相同,只是把标签换成绝对位置
>>> csv.iloc[[0,1],2:3] b0 21 3[2 rows x 1 columns]
- 用where操作通过表达式过滤部分值,并且将过滤掉的值作为NaN
- 使用isin([value])方法:去除特定列当中与变量值相等的行,返回一个DataFrame
>>> csv[csv['b'].isin([2,3,4])] a e b c d0 1 1 2 3 61 1 1 3 4 122 1 1 4 5 20[3 rows x 5 columns]
NaN
1. DataFrame.dropna.(axis,how) 常用参数为axis和how
axis为0/1参数;
how为any/all参数,any是存在NaN就把对应的整行/列删除,all是全部为NaN才把对应的整行/列删除
>>> csv['g']=np.NaN>>> csv a e b c d g0 1 1 2 3 6 NaN1 1 1 3 4 12 NaN2 1 1 4 5 20 NaN3 1 1 5 6 30 NaN>>> csv.dropna(axis=1,how='any') a e b c d0 1 1 2 3 61 1 1 3 4 122 1 1 4 5 203 1 1 5 6 30
- DataFrame.fillna(value) 将所有NaN赋值为value
>>> csv.isnull() a e b c d g0 False False False False False True1 False False False False False True2 False False False False False True3 False False False False False True
合并
合并的时候尽量保证columns是相同的,有利于后续操作
1. pd.concat([DataFrame1,···],ignore_index) 可以多个DataFrame进行合并,ignore_index是boolean值,用来确定要不要重新对index从0开始赋值。
2. pd.merge(DataFrame1,DataFrame2) DataFrame1在合并后的上面DataFrame2在合并后的下面;on是确定合并的列。同时merge会重新分配index,不会出现index重合
3. DataFrame.append(object,ignore_index) 在DataFrame尾部添加一个object,可以是DataFrame也可以是Series,ignore_index就是用来确定要不要重新对index从0开始赋值,这个比较好理解。
分组
1. 通过groupby命令实现的,主要实现的功能是按照一些规则将数据分为不同的组;对于每组数据分别执行一个函数;将结果组合到一个数据结构中。
DataFrame.groupby(by=None, axis=0, as_index=True)
参数解释:
- by是按照分组的列名
- axis是作用维度,0为行,1为列
- as_index指的是分组依据是否作为索引存在,有多个分组依据时,会合并成一个tuple,作为一列
2. aggregate(arg)方法可以打印分好组的group,arg可以为dict类型或者list类型
>>> g = csv.groupby(['b','c'])>>> g<pandas.core.groupby.DataFrameGroupBy object at 0x7f1654a0cf50>>>> g.aggregate(np.sum) e d gb c 2 3 1 6 NaN3 4 1 12 NaN4 5 1 20 NaN>>> g = csv.groupby(['b','c'],as_index=False)>>> g.aggregate(np.sum) b c e d g0 2 3 1 6 NaN1 3 4 1 12 NaN2 4 5 1 20 NaN3 5 6 1 30 NaN
然后可以通过agg(arg)方法对分好组的group进行计算(arg可以为dict类型或者list类型)
>>> g = csv.groupby('b')>>> g['b'].agg([np.mean]) meanb 2 23 34 45 5
时间
时间部分比较复杂,涉及到时区,时间戳,时间跨度等转换
三、Panel/PanelND
多维数组由于篇幅和内容深度的问题无法继续展开,但是基本操作的框架和前面两个相似
常用pandas操作
拆分数据框列到多列
参考博客:拆分
方法1:apply函数
df = pd.read_csv(fname, comment="#")dfs = df[df.TEST == 'READ']# function to convert the hexstring into a binary stringdef hex2bin(hstr): return bin(int(hstr,16))[2:]# convert the hexstring in column DATA to binarystring ROWDATAdfs['BINDATA'] = dfs['DATA'].apply(hex2bin)# get rid of the column DATAdel dfs['DATA']
方法2:简单字符操作
for i in range(16): dfs['B'+str(i)] = dfs['BINDATA'].str[i]
方法3: 不是很懂
import pandas as pd# read the above frame from the clipboarddf = pd.read_clipboard(converters={'BINDATA': str})df = df.fillna(nan).replace('None', nan).dropna(axis=0, how='all')# here are the lines that matterbindata = df.BINDATA.apply(list).apply(Series)bindata.columns = bindata.columns.map('B{0}'.format)res = pd.concat([df, bindata], axis=1).convert_objects(convert_numeric=True)
四、其他博客
很多实例:http://www.cnblogs.com/chaosimple/p/4153083.html
常用操作:http://python.jobbole.com/85742/
数据分析:http://www.cnblogs.com/nxld/p/6058591.html
- python数据挖掘包Pandas基本操作
- python数据挖掘包numpy基本操作
- Python数据分析库pandas基本操作
- Pandas数据基本操作
- 用python做数据分析|pandas库:DataFrame基本操作
- python数据挖掘02--pandas基础
- 【Python数据挖掘】实用模块之Pandas
- python/pandas数据挖掘 groupby,聚合
- 【Python数据挖掘课程】六.Numpy、Pandas和Matplotlib包基础知识
- Python数据挖掘课程 六.Numpy、Pandas和Matplotlib包基础知识
- Python数据挖掘学习02--numpy和pandas模块基本使用
- python数据挖掘常用包
- python数据挖掘包Sklearn
- Python 数据处理扩展包: pandas 模块的DataFrame介绍(创建和基本操作)
- Python 数据分析包:pandas 基础
- Python 数据分析包:pandas 入门
- Python 数据分析包:pandas 基础
- Python 数据分析包:pandas 基础
- Java数据类型
- java 检测class文件走哪个jar包的代码
- AndroidManifest合并原理
- 杭电-PID1012-u Calculate e
- AndroidStudio导入Eclipse项目出现Error:java.util.concurrent.ExecutionException
- python数据挖掘包Pandas基本操作
- netlink快速使用例程(linux-3.3.8)
- together项目进度报告3
- 对于Session、Cookie的理解
- ORM是什么?
- spring中Dispatchservlet中doDispath方法分析
- HDUOJ3549
- python爬虫_糗事百科
- C语言中的修饰词const