Pandas里有数据类型主要有三种:Series、DataFrame和Panel。
(一)Series
Series可以理解为一个一维的数组,只是index可以自己改动。创建的方法统一为pd.Series(data,index=)。Series可以通过三种形式创建:python的dict、numpy当中的ndarray(numpy中的基本数据结构)、具体某个数值。index赋值必须是list类型。
1.创建Series
(1)Python的dict创建:
s = pd.Series({‘a’=1,’b’=2,’d’=3},index = [‘a’,’d’,’c’,b’])
(2)numpy中的ndarray:
pd.Series(np.random.randn(5), index = list('ABCDE')
(3)具体某个值
s=pd.Series([5,4])
2.读取元素
通过索引读取:一种是通过index对应的标签;另一种就是通过绝对位置查看。
s = pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])
s[0]
输出:5.0
s[[4,3,1]]
输出:e 5.0
d 5.0
b 5.0
dtype: float64
s[s>1]
输出:a 5.0
b 5.0
c 5.0
d 5.0
e 5.0
dtype: float64
s[‘a’]
输出:5.0
(二)DataFramme
DataFrame是一个类似于表格的数据类型,如图:
1.创建
DataFrame可以理解为一个二维数组,统一的创建形式为:pd.DataFrame(data,columns=,index=),其中columns为列的索引,index为行的索引,data为数据。Data创建方式如下:
(1)将字典或者Series组合成列表进行创建
a = {'a':1,'b':2}
b = pd.Series([1,2,3],index=list('abc'))
pd.DataFrame([a,b],columns = list('abcd'))
输出:a b c d
0 1 2 NaN NaN
1 1 2 3.0 NaN
(2)将两者放入字典里面创建
a = {'a':1,'b':2}
b = pd.Series([1,2,3],index=list('abc'))
data = {'one':a,'two':b}
pd.DataFrame(data,columns = ['one','two','a','d'])
输出:one two a d
a 1.0 1 NaN NaN
b 2.0 2 NaN NaN
c NaN 3 NaN NaN
2.查询
DataFrame.head可以查询前几行的数据,默认为前五行;DataFrame.tail查看后几行书,默认为5行;DataFrame.describe查看全部数据。
3.排序
df.sort_index(axis=,ascending=) axis为0/1的参数,表示按行/按列排序;ascending为boolean参数,False表示降序,True表示升序。
df.sort_values(by=,ascending=) by表示按哪一个columns参数排序。
4.删除
使用del或者pop(‘columns’)方法。需要注意的是所有删除的方法都会改变原来DataFrame,而不是像其他方法一样内存当中新建一个DataFrame。pop由于弹出特定的列,会返回被弹出的列中的数值.
5.选择/切片
用columns选择列,用index选择行。注意:选择列的时候单次只能选择某一列的数据,不能同时选择多列;而使用index的时候一定要使用范围(类似于[1:2]),单独某个index会报错。
df['one']>2
输出:A False
B True
Name: one, dtype: bool
df['two']
输出:A 2
B 5
Name: two, dtype: int64
df[:1]
输出:one bar two three fore five
A 1 1 2 3 1 1.0
使用loc方法,通过位置标签选择,统一格式为DataFrame.loc[index:index,[‘columns’]],loc方法当中的columns可以选择多列,如果表示只按列选择的话index可以不填但是冒号(:)和逗号(,)一定要写。
df.loc[:,['two','one']]
输出:two one
A 2 1
B 5 4
df.loc['A':'B',['one','two']]
输出:one two
A 1 2
B 4 5
另外,如果loc还能这么用:DataFrame.loc[index,[‘columns’]],这时的index为特定能够的label或值,这样用会返回一个Series;DataFrame.loc[index,‘columns’],这里面的index和columns都是唯一的,返回一个值。由于降维的问题,pandas会对精度进行转换。
df.loc['A',['one']]
输出:one 1.0
Name: A, dtype: float64
df.loc['A','one']
输出:1.0
使用iloc方法,通过绝对位置选择,思路与loc方法基本相同,只是把标签换成绝对位置。
df.iloc[[0,1],2:3]
输出:two
A 2
B 5
使用where操作通过表达式过滤部分值
df[df>3]
isin([value])方法: 通过isin方法可以得到特定列当中与变量值相等的行,返回一个DataFrame。
df[df['one'].isin([1])]
输出:one bar two three fore five
A 1 1 2 3 1 1
6.添加或修改
直接赋值
df['fore'] = 1
df['five'] = df['one'][:1]
此外也可以通过insert(loc, column, value, allow_duplicates=False)方法
df.insert(1, 'bar', df['one'])
7.合并
pd.concat(objs,ignore_index,…) 可以多个DataFrame进行合并,其中objs是一个包含series或DataFrame或Panel的序列,ignore_index是boolean值,用来确定要不要重新对index从0开始赋值。
frames = [df1, df2, df3]
result = pd.concat(frames)
pd.merge(df1,df2,…..) 。df1在合并后的上面df2在合并后的下面。同时merge会重新分配index,不会出现index重合。merge是个大坑,合并完一定是个乱七八糟的。
DataFrame.append(object,ignore_index) 在DataFrame尾部添加一个object,可以是DataFrame也可以是Series。
8.分组
分组是通过groupby命令实现的,主要实现的功能是按照一些规则将数据分为不同的组;对于每组数据分别执行一个函数;将结果组合到一个数据结构中。
DataFrame.groupby(by=None, axis=0, as_index=True)
by是按照分组的列名;axis是作用维度,0为行,1为列;as_index指的是分组依据是否作为索引存在,有多个分组依据时,会合并成一个tuple,作为一列。
通过aggregate(arg)方法可以打印分好组的group,arg可以为dict类型或者list类型。
通过agg(arg)方法对分好组的group进行计算(arg可以为dict类型或者list类型)。
g = df.groupby('A')
g['D'].agg([np.mean])
输出:mean
A
bar 1
foo 1
9.选取行或列
9.1选择列:
返回Series
data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型
data.w #选择表格中的'w'列,使用点属性,返回的是Series类型
data.icol(0) #取data的第一列
返回DataFrame
data['a':'b'] #利用index值进行切片,返回的是**前闭后闭**的DataFrame,
data[['w']] #选择表格中的'w'列,返回的是DataFrame属性
data[['w','z']] #选择表格中的'w'、'z'列
9.2选择行:
data.irow(0) #取data的第一行
data[0:2] #返回第1行到第2行的所有行,前闭后开,包括前不包括后
data[1:2] #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,
data.ix[1:2] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同
10.去掉重复数据
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
11.从DataFrame中提取出Series或DataFrame对象
df = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'],
'data1': range(6)})
type(df['data1']) #pandas.core.series.Series
type(df[['data1']]) pandas.core.frame.DataFrame
(三)Panel/PanelND
Panel可以理解为三维数组,panelND可以理解为N维数组。统一的创建方法就是pd.Panel(data,items=,major_axis=,minor_axis=),三个维度就分别是items、major_axis、minor_axis。
在创建panel的时候一般会采用两种形式(和DataFrame类似,照搬就行):采用字典;使用items参数创建。