1、dataframe的创建

dataframe是一种表格型数据结构,它含有一组有序的列,每列可以是不同的值。dataframe既有行索引,也有列索引,它可以看作是由series组成的字典,不过这些series公用一个索引。
dataframe的创建有多种方式,不过最重要的还是根据dict进行创建,以及读取csv或者txt文件来创建。这里主要介绍这两种方式。

根据字典创建

data = {
    'state':['ohio','ohio','ohio','nevada','nevada'],
    'year':[2000,2001,2002,2001,2002],
    'pop':[1.5,1.7,3.6,2.4,2.9]
}
frame = pd.dataframe(data)
frame

#输出
    pop state   year
0   1.5 ohio    2000
1   1.7 ohio    2001
2   3.6 ohio    2002
3   2.4 nevada  2001
4   2.9 nevada  2002

dataframe的行索引是index,列索引是columns,我们可以在创建dataframe时指定索引的值:

frame2 = pd.dataframe(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt'])
frame2

#输出
    year    state   pop debt
one 2000    ohio    1.5 nan
two 2001    ohio    1.7 nan
three   2002    ohio    3.6 nan
four    2001    nevada  2.4 nan
five    2002    nevada  2.9 nan

使用嵌套字典也可以创建dataframe,此时外层字典的键作为列,内层键则作为索引:

pop = {'nevada':{2001:2.4,2002:2.9},'ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3 = pd.dataframe(pop)
frame3
#输出
    nevada  ohio
2000    nan 1.5
2001    2.4 1.7
2002    2.9 3.6

我们可以用indexcolumnsvalues来访问dataframe的行索引,列索引以及数据值,数据值返回的是一个二维的ndarray

frame2.values
#输出
array([[2000, 'ohio', 1.5, 0],
       [2001, 'ohio', 1.7, 1],
       [2002, 'ohio', 3.6, 2],
       [2001, 'nevada', 2.4, 3],
       [2002, 'nevada', 2.9, 4]], dtype=object)

读取文件

读取文件生成dataframe最常用的是read_csv,read_table方法。

该方法中几个重要的参数如下所示:

参数 描述
header 默认第一行为columns,如果指定header=none,则表明没有索引行,第一行就是数据
index_col 默认作为索引的为第一列,可以设为index_col为-1,表明没有索引列
nrows 表明读取的行数
sep或delimiter 分隔符,read_csv默认是逗号,而read_table默认是制表符\t
encoding 编码格式

其他创建dataframe的方式有很多,比如我们可以通过读取mysql或者mongodb来生成,也可以读取json文件等等,这里就不再介绍。

2、dataframe轴的概念

dataframe的处理中经常会遇到轴的概念,这里先给大家一个直观的印象,我们所说的axis=0即表示沿着每一列或行标签\索引值向下执行方法,axis=1即表示沿着每一行或者列标签模向执行对应的方法。

3、dataframe一些性质

索引、切片

我们可以根据列名来选取一列,返回一个series:

frame2['year']
#输出
one      2000
two      2001
three    2002
four     2001
five     2002
name: year, dtype: int64

我们还可以选取多列或者多行:

data = pd.dataframe(np.arange(16).reshape((4,4)),index = ['ohio','colorado','utah','new york'],columns=['one','two','three','four'])
data[['two','three']]
#输出
    two three
ohio    1   2
colorado    5   6
utah    9   10
new york    13  14

#取行
data[:2]
#输出
    one two three   four
ohio    0   1   2   3
colorado    4   5   6   7

当然,在选取数据的时候,我们还可以根据逻辑条件来选取:

data[data['three']>5]
#输出
    one two three   four
colorado    4   5   6   7
utah    8   9   10  11
new york    12  13  14  15

pandas提供了专门的用于索引dataframe的方法,即使用ix方法进行索引,不过ix在最新的版本中已经被废弃了,如果要是用标签,最好使用loc方法,如果使用下标,最好使用iloc方法:

#data.ix['colorado',['two','three']]
data.loc['colorado',['two','three']]
#输出
two      5
three    6
name: colorado, dtype: int64

data.iloc[0:3,2]
#输出
ohio         2
colorado     6
utah        10
name: three, dtype: int64

修改数据

可以使用一个标量修改dataframe中的某一列,此时这个标量会广播到dataframe的每一行上:

data = {
    'state':['ohio','ohio','ohio','nevada','nevada'],
    'year':[2000,2001,2002,2001,2002],
    'pop':[1.5,1.7,3.6,2.4,2.9]
}
frame2 = pd.dataframe(data,index=['one','two','three','four','five'],columns=['year','state','pop','debt'])
frame2
frame2['debt']=16.5
frame2
#输出
year    state   pop debt
one 2000    ohio    1.5 16.5
two 2001    ohio    1.7 16.5
three   2002    ohio    3.6 16.5
four    2001    nevada  2.4 16.5
five    2002    nevada  2.9 16.5

也可以使用一个列表来修改,不过要保证列表的长度与dataframe长度相同:

frame2.debt = np.arange(5)
frame2
#输出
    year    state   pop debt
one 2000    ohio    1.5 0
two 2001    ohio    1.7 1
three   2002    ohio    3.6 2
four    2001    nevada  2.4 3
five    2002    nevada  2.9 4

可以使用一个series,此时会根据索引进行精确匹配:

val = pd.series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt'] = val
frame2
#输出
    year    state   pop debt
one 2000    ohio    1.5 nan
two 2001    ohio    1.7 -1.2
three   2002    ohio    3.6 nan
four    2001    nevada  2.4 -1.5
five    2002    nevada  2.9 -1.7

重新索引

使用reindex方法对dataframe进行重新索引。对dataframe进行重新索引,可以重新索引行,列或者两个都修改,如果只传入一个参数,则会从新索引行:

frame = pd.dataframe(np.arange(9).reshape((3,3)),index=[1,4,5],columns=['ohio','texas','california'])
frame2 = frame.reindex([1,2,4,5])
frame2
#输出
    ohio    texas   california
1   0.0 1.0 2.0
2   nan nan nan
4   3.0 4.0 5.0
5   6.0 7.0 8.0

states = ['texas','utah','california']
frame.reindex(columns=states)
#输出
    texas   utah    california
1   1   nan 2
4   4   nan 5
5   7   nan 8

填充数据只能按行填充,此时只能对行进行重新索引:

frame = pd.dataframe(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['ohio','texas','california'])
frame.reindex(['a','b','c','d'],method = 'bfill')
#frame.reindex(['a','b','c','d'],method = 'bfill',columns=states) 报错

丢弃指定轴上的值

可以使用drop方法丢弃指定轴上的值,不会对原dataframe产生影响

frame = pd.dataframe(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['ohio','texas','california'])
frame.drop('a') 
#输出
ohio    texas   california
a   0   1   2
c   3   4   5
d   6   7   8

frame.drop(['ohio'],axis=1)
#输出
    texas   california
a   1   2
c   4   5
d   7   8

算术运算

dataframe在进行算术运算时会进行补齐,在不重叠的部分补足na:

df1 = pd.dataframe(np.arange(9).reshape((3,3)),columns=list('bcd'),index=['ohio','texas','colorado'])
df2 = pd.dataframe(np.arange(12).reshape((4,3)),columns = list('bde'),index=['utah','ohio','texas','oregon'])
df1 + df2
#输出
    b   c   d   e
colorado    nan nan nan nan
ohio    3.0 nan 6.0 nan
oregon  nan nan nan nan
texas   9.0 nan 12.0    nan
utah    nan nan nan nan

可以使用fill_value方法填充na数据,不过两个df中都为na的数据,该方法不会填充:

df1.add(df2,fill_value=0)
#输出
    b   c   d   e
colorado    6.0 7.0 8.0 nan
ohio    3.0 1.0 6.0 5.0
oregon  9.0 nan 10.0    11.0
texas   9.0 4.0 12.0    8.0
utah    0.0 nan 1.0 2.0

函数应用和映射

numpy的元素级数组方法,也可以用于操作pandas对象:

frame = pd.dataframe(np.random.randn(3,3),columns=list('bcd'),index=['ohio','texas','colorado'])
np.abs(frame)
#输出
    b   c   d
ohio    0.367521    0.232387    0.649330
texas   3.115632    1.415106    2.093794
colorado    0.714983    1.420871    0.557722

另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上。dataframe的apply方法即可实现此功能。

f = lambda x:x.max() - x.min()
frame.apply(f)
#输出
b    3.830616
c    2.835978
d    2.743124
dtype: float64

frame.apply(f,axis=1)
#输出
ohio        1.016851
texas       4.530739
colorado    2.135855
dtype: float64

def f(x):
    return pd.series([x.min(),x.max()],index=['min','max'])
frame.apply(f)
#输出
    b   c   d
min -0.714983   -1.415106   -0.649330
max 3.115632    1.420871    2.093794

元素级的python函数也是可以用的,使用applymap方法:

format = lambda x:'%.2f'%x
frame.applymap(format)
#输出
b   c   d
ohio    0.37    -0.23   -0.65
texas   3.12    -1.42   2.09
colorado    -0.71   1.42    -0.56

排序和排名

对于dataframe,sort_index可以根据任意轴的索引进行排序,并指定升序降序

frame = pd.dataframe(np.arange(8).reshape((2,4)),index=['three','one'],columns=['d','a','b','c'])
frame.sort_index()
#输出
    d   a   b   c
one 4   5   6   7
three   0   1   2   3

frame.sort_index(1,ascending=false)
#输出
    d   a   b   c
one 4   5   6   7
three   0   1   2   3

dataframe也可以按照值进行排序:

#按照任意一列或多列进行排序
frame.sort_values(by=['a','b'])
#输出
    d   a   b   c
three   0   1   2   3
one 4   5   6   7

汇总和计算描述统计

dataframe中的实现了sum、mean、max等方法,我们可以指定进行汇总统计的轴,同时,也可以使用describe函数查看基本所有的统计项:

df = pd.dataframe([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])
df.sum(axis=1)
#输出
one    9.25
two   -5.80
dtype: float64

#na会被自动排除,可以使用skipna选项来禁用该功能
df.mean(axis=1,skipna=false)
#输出
a      nan
b    1.300
c      nan
d   -0.275
dtype: float64
#idxmax返回间接统计,是达到最大值的索引

df.idxmax()
#输出
one    b
two    d
dtype: object

#describe返回的是dataframe的汇总统计
#非数值型的与数值型的统计返回结果不同
df.describe()
#输出
one two
count   3.000000    2.000000
mean    3.083333    -2.900000
std 3.493685    2.262742
min 0.750000    -4.500000
25% 1.075000    -3.700000
50% 1.400000    -2.900000
75% 4.250000    -2.100000
max 7.100000    -1.300000

dataframe也实现了corr和cov方法来计算一个dataframe的相关系数矩阵和协方差矩阵,同时dataframe也可以与series求解相关系数。

frame1 = pd.dataframe(np.random.randn(3,3),index=list('abc'),columns=list('abc'))
frame1.corr
#输出
<bound method dataframe.corr of           a         b         c
a  1.253773  0.429059  1.535575
b -0.113987 -2.837396 -0.894469
c -0.548208  0.834003  0.994863>

frame1.cov()
#输出
a   b   c
a   0.884409    0.357304    0.579613
b   0.357304    4.052147    2.442527
c   0.579613    2.442527    1.627843

#corrwith用于计算每一列与series的相关系数
frame1.corrwith(frame1['a'])
#输出
a    1.000000
b    0.188742
c    0.483065
dtype: float64

处理缺失数据

pandas中缺失值相关的方法主要有以下三个:

  • isnull方法用于判断数据是否为空数据;
  • fillna方法用于填补缺失数据;
  • dropna方法用于舍弃缺失数据。

上面两个方法返回一个新的series或者dataframe,对原数据没有影响,如果想在原数据上进行直接修改,使用inplace参数:

data = pd.dataframe([[1,6.5,3],[1,np.nan,np.nan],[np.nan,np.nan,np.nan],[np.nan,6.5,3]])
data.dropna()
#输出
    0   1   2
0   1.0 6.5 3.0

dataframe来说,dropna方法如果发现缺失值,就会进行整行删除,不过可以指定删除的方式,how=all,是当整行全是na的时候才进行删除,同时还可以指定删除的轴。

data.dropna(how='all',axis=1,inplace=true)
data
#输出
0   1   2
0   1.0 6.5 3.0
1   1.0 nan nan
2   nan nan nan
3   nan 6.5 3.0
dataframe填充缺失值可以统一填充,也可以按列填充,或者指定一种填充方式:

data.fillna({1:2,2:3})
#输出
0   1   2
0   1.0 6.5 3.0
1   1.0 2.0 3.0
2   nan 2.0 3.0
3   nan 6.5 3.0

data.fillna(method='ffill')
#输出
0   1   2
0   1.0 6.5 3.0
1   1.0 6.5 3.0
2   1.0 6.5 3.0
3   1.0 6.5 3.0

到此这篇关于pandas-dataframe知识点汇总的文章就介绍到这了,更多相关pandas-dataframe内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!