pandas入门练习-数据结构

pandas 是python的一个数据分析包,是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。提供了高效地操作大型数据集所需的工具,使得数据分析工作变着简单高效。

pandas数据结构介绍

Series是一种类似于一维数组的对象,它由一维组数(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series

from pandas import Series,DataFrame
import pandas as pd
import numpy as np
obj=Series([4,7,-5,3])
obj
0    4
1    7
2   -5
3    3
dtype: int64

Series的字符串表现形式是:索引在左边,值在右边,由于没有为数据指定索引,就会自动创建一个0到N-1的整数型索引。可以通过Series的values和index属性获取其数组表示形式和索引对象。

obj.values

    array([ 4,  7, -5,  3], dtype=int64)
obj.index
    RangeIndex(start=0, stop=4, step=1)
我们希望创建的Series带有一个可以对各个数据点进行标记的索引
obj2=Series([4,7,-5,3],index=['d','b','a','c'])
obj2
    d    4
    b    7
    a   -5
    c    3
    dtype: int64
obj2.index
    Index(['d', 'b', 'a', 'c'], dtype='object')
通过索引的方式选取Series中的一个或者一组值
obj2['a']
    -5
obj2['d']=6
obj2[['c','a','d']]
    c    3
    a   -5
    d    6
    dtype: int64
Numpy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的连接。
obj2
    d    6
    b    7
    a   -5
    c    3
    dtype: int64
obj2[obj2>0]
    d    6
    b    7
    c    3
    dtype: int64
obj2*2
    d    12
    b    14
    a   -10
    c     6
    dtype: int64
np.exp(obj2)
    d     403.428793
    b    1096.633158
    a       0.006738
    c      20.085537
    dtype: float64
可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。可以用在许多原本需要字典参数的函数中。
'b' in obj2
    True
'k' in obj2
    False
如果数据被存放在一个python字典中,通过这个字典来创建Series
sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
obj3
    Ohio      35000
    Oregon    16000
    Texas     71000
    Utah       5000
    dtype: int64
states=['California','Ohio','Oregon','Texas']
obj4=Series(sdata,index=states)
obj4
    California        NaN
    Ohio          35000.0
    Oregon        16000.0
    Texas         71000.0
    dtype: float64
pandas的isnull和notnull函数可用于检测缺失数据
pd.isnull(obj4)
    California     True
    Ohio          False
    Oregon        False
    Texas         False
    dtype: bool
pd.notnull(obj4)
    California    False
    Ohio           True
    Oregon         True
    Texas          True
    dtype: bool
obj4.isnull()

    California     True
    Ohio          False
    Oregon        False
    Texas         False
    dtype: bool
在算术运算中会自动对齐不同索引的数据
obj3
    Ohio      35000
    Oregon    16000
    Texas     71000
    Utah       5000
    dtype: int64
obj4
    California        NaN
    Ohio          35000.0
    Oregon        16000.0
    Texas         71000.0
    dtype: float64
obj3+obj4
    California         NaN
    Ohio           70000.0
    Oregon         32000.0
    Texas         142000.0
    Utah               NaN
    dtype: float64
Series对象本身及其索引都有一个name属性,该属性跟padans其他的关键功能关系很密切
obj4.name='population'
obj4.index.name='state'
obj4
    state
    California        NaN
    Ohio          35000.0
    Oregon        16000.0
    Texas         71000.0
    Name: population, dtype: float64
Series的索引可通过赋值的方式修改
obj.index=['Bob','Steve','Jeff','Ryan']
obj
    Bob      4
    Steve    7
    Jeff    -5
    Ryan     3
    dtype: int64
###DataFrame表格型数据结构 DataFrame含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),有行索引也有列索引,可以看作是由Series组成的字典(共同用一个索引)。DataFrame中面向行和面向列的基本操作是平衡的。DataFrame中的数据是以一个或多个二维存放的(而不是列表、字典或别的一维数据结构) 构建DataFrame的办法很多种,最常用的一种是传入一个由等长列表或者Numpy数组组成的字典。
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=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会自动加上索引(跟Series一样),且全部列会被有序排列。

DataFrame的列会按照指定的列序指定顺序进行排列

DataFrame(data,columns=['year','state','pop'])
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9

和Series同样,如果传入的列在数据中找不到,会产生NA值

frame2=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
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
frame2['state']
    one        Ohio
    two        Ohio
    three      Ohio
    four     Nevada
    five     Nevada
    Name: state, dtype: object
frame2.year
    one      2000
    two      2001
    three    2002
    four     2001
    five     2002
    Name: year, dtype: int64
frame2.ix['three']
    year     2002
    state    Ohio
    pop       3.6
    debt      NaN
    Name: three, dtype: object
列可以通过赋值的方式修改
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
frame2['debt']=np.arange(5.)
frame2
year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0

将数组或者列表赋值给某个列时,其长度需要跟DataFrame的长度相匹配,如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都会填写上缺失值。

val=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

为不存在的列赋值会创建一个新列,关键字del用于删除列

frame2['eastern']=frame2.state=='Ohio'
frame2
year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
del frame2['eastern']
frame2.columns
    Index(['year', 'state', 'pop', 'debt'], dtype='object')
嵌套字典,外层字典的键作为列,内层键作为行索引
pop={'Nevada':{2001:2.4,2002:2.9},
    ....:'Ohio':{2000:1.5,2001:107,2002:3.6}}
frame3=DataFrame(pop)
frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 107.0
2002 2.9 3.6

对结果进行转置

frame3.T
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 107.0 3.6

内层的字典键会被合并、排序以形成最终的索引。如果显示指定了索引,则不会这样

DataFrame(pop,index=[2001,2002,2003])
Nevada Ohio
2001 2.4 107.0
2002 2.9 3.6
2003 NaN NaN
pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}
DataFrame(pdata)
Nevada Ohio
2000 NaN 1.5
2001 2.4 107.0

下表列出了DataFrame构造函数所能接受的各种数据

这里写图片描述

如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来

frame3.index.name='year';frame3.columns.name='state'
frame3
state Nevada Ohio
year
2000 NaN 1.5
2001 2.4 107.0
2002 2.9 3.6

跟Series一样,values属性也会以二维ndarry的形式返回DataFrame中的数据

frame3.values
    array([[   nan,    1.5],
           [   2.4,  107. ],
           [   2.9,    3.6]])
如果DataFrame各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数
frame2.values
    array([[2000, 'Ohio', 1.5, nan],
           [2001, 'Ohio', 1.7, -1.2],
           [2002, 'Ohio', 3.6, nan],
           [2001, 'Nevada', 2.4, -1.5],
           [2002, 'Nevada', 2.9, -1.7]], dtype=object)
索引对象:padas对象负责管理轴标签和其他元数据(比如轴名称等)。 构建Series和DataFrame时,所用到的任何数组或其他序列的标签会被转换成一个index
obj=Series(range(3),index=['a','b','c'])
index=obj.index
index
    Index(['a', 'b', 'c'], dtype='object')
index[1:]
    Index(['b', 'c'], dtype='object')
index对象是不可以修改的(immutable),因此用户不能对其进行修改
index[1]='d'
—————————————————————————
    TypeError                                 Traceback (most recent call last)

    <ipython-input-49-8be6e68dba2d> in <module>()
    ----> 1 index[1]='d'


    e:\python\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
       1722 
       1723     def __setitem__(self, key, value):
    -> 1724         raise TypeError("Index does not support mutable operations")
       1725 
       1726     def __getitem__(self, key):


    TypeError: Index does not support mutable operations
index不可修改的重要性,这样才能使得index对象在多个数据结构之间安全共享
index=pd.Index(np.arange(3))
obj2=Series([1.5,-2.5,0],index=index)
obj2.index is index

    True

下表列出了pandas库内置的index类

这里写图片描述

frame3
Nevada Ohio
2000 NaN 1.5
2001 2.4 107.0
2002 2.9 3.6
'Ohio' in frame3.columns
True
2003 in frame3.index
False

每个索引都一些方法和属性,可用于设置逻辑并回答有关该索引所包含的数据的常见的问题 这里写图片描述

猜你喜欢

转载自blog.csdn.net/lumugua/article/details/78709339