最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

pandas教程:Introduction to pandas Data Structures pandas的数据结构

维修 admin 77浏览 0评论

pandas教程:Introduction to pandas Data Structures pandas的数据结构

文章目录

  • Chapter 5 Getting Started with pandas
  • 5.1 Introduction to pandas Data Structures
  • 1 Series
  • 2 DataFrame
  • 3 Index Objects (索引对象)

Chapter 5 Getting Started with pandas

这样导入pandas

import pandas as pd
e:\python3.7\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
e:\python3.7\lib\site-packages\numpy\.libs\libopenblas.TXA6YQSD3GCQQC22GEQ54J2UDCXDXHWN.gfortran-win_amd64.dll
e:\python3.7\lib\site-packages\numpy\.libs\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dllstacklevel=1)

另外可以导入SeriesDataFrame,因为这两个经常被用到:

from pandas import Series, DataFrame

5.1 Introduction to pandas Data Structures

数据结构其实就是SeriesDataFrame

1 Series

这里series我就不翻译成序列了,因为之前的所有笔记里,我都是把sequence翻译成序列的。

series是一个像数组一样的一维序列,并伴有一个数组表示label,叫做index。创建一个series的方法也很简单:

obj = pd.Series([4, 7, -5, 3])
obj
0    4
1    7
2   -5
3    3
dtype: int64

可以看到,左边表示index,右边表示对应的value。可以通过valueindex属性查看:

obj.values
array([ 4,  7, -5,  3], dtype=int64)
obj.index # like range(4)
RangeIndex(start=0, stop=4, step=1)

当然我们也可以自己指定indexlabel

obj2 = pd.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')

可以用indexlabel来选择:

obj2['a']
-5
obj2['d'] = 6
obj2[['c', 'a', 'd']]
c    3
a   -5
d    6
dtype: int64

这里[‘c’, ‘a’, ‘d’]其实被当做了索引,尽管这个索引是用string构成的。

使用numpy函数或类似的操作,会保留index-value的关系:

obj2[obj2 > 0]
d    6
b    7
c    3
dtype: int64
obj2 * 2
d    12
b    14
a   -10
c     6
dtype: int64
import numpy as np
np.exp(obj2)
d     403.428793
b    1096.633158
a       0.006738
c      20.085537
dtype: float64

另一种看待series的方法,它是一个长度固定,有顺序的dict,从index映射到value。在很多场景下,可以当做dict来用:

'b' in obj2
True
'e' in obj2
False

还可以直接用现有的dict来创建series

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon':16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
obj3
Ohio      35000
Texas     71000
Oregon    16000
Utah       5000
dtype: int64

series中的index其实就是dict中排好序的keys。我们也可以传入一个自己想要的顺序:

states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = pd.Series(sdata, index=states)
obj4
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64

顺序是按states里来的,但因为没有找到california,所以是NaNNaN表示缺失数据,用之后我们提到的话就用missingNA来指代。pandas中的isnullnotnull函数可以用来检测缺失数据:

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

series也有对应的方法:

obj4.isnull()
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

关于缺失数据,在第七章还会讲得更详细一些。

series中一个有用的特色自动按index label来排序(Data alignment features):

obj3
Ohio      35000
Texas     71000
Oregon    16000
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

这个Data alignment features(数据对齐特色)和数据库中的join相似。

series自身和它的index都有一个叫name的属性,这个能和其他pandas的函数进行整合:

obj4.name = 'population'
obj4.index.name = 'state'
obj4
state
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64

seriesindex能被直接更改:

obj
0    4
1    7
2   -5
3    3
dtype: int64
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
obj
Bob      4
Steve    7
Jeff    -5
Ryan     3
dtype: int64

2 DataFrame

DataFrame表示一个长方形表格,并包含排好序的列,每一列都可以是不同的数值类型(数字,字符串,布尔值)。DataFrame有行索引和列索引(row index, column index);可以看做是分享所有索引的由series组成的字典。数据是保存在一维以上的区块里的。

(其实我是把dataframe当做excel里的那种表格来用的,这样感觉更直观一些)

构建一个dataframe的方法,用一个dcitdict里的值是list

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}frame = pd.DataFrame(data)frame
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002
53.2Nevada2003

dataframe也会像series一样,自动给数据赋index, 而列则会按顺序排好。

对于一个较大的DataFrame,用head方法会返回前5行(注:这个函数在数据分析中经常使用,用来查看表格里有什么东西):

frame.head()
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002

如果指定一列的话,会自动按列排序:

pd.DataFrame(data, columns=['year', 'state', 'pop'])
yearstatepop
02000Ohio1.5
12001Ohio1.7
22002Ohio3.6
32001Nevada2.4
42002Nevada2.9
52003Nevada3.2

如果你导入一个不存在的列名,那么会显示为缺失数据:

frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7NaN
three2002Ohio3.6NaN
four2001Nevada2.4NaN
five2002Nevada2.9NaN
six2003Nevada3.2NaN
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')

DataFrame里提取一列的话会返回series格式,可以以属性或是dict一样的形式来提取:

frame2['state']
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
six      Nevada
Name: state, dtype: object
frame2.year
one      2000
two      2001
three    2002
four     2001
five     2002
six      2003
Name: year, dtype: int64

注意:frame2[column]能应对任何列名,但frame2.column的情况下,列名必须是有效的python变量名才行。

返回的seriesDataFrame种同样的index,而且name属性也是对应的。

对于行,要用在loc属性里用 位置或名字:

frame2.loc['three']
year     2002
state    Ohio
pop       3.6
debt      NaN
Name: three, dtype: object

列值也能通过赋值改变。比如给debt赋值:

frame2['debt'] = 16.5
frame2
yearstatepopdebt
one2000Ohio1.516.5
two2001Ohio1.716.5
three2002Ohio3.616.5
four2001Nevada2.416.5
five2002Nevada2.916.5
six2003Nevada3.216.5
frame2['debt'] = np.arange(6.)
frame2
yearstatepopdebt
one2000Ohio1.50.0
two2001Ohio1.71.0
three2002Ohio3.62.0
four2001Nevada2.43.0
five2002Nevada2.94.0
six2003Nevada3.25.0

如果把listarray赋给column的话,长度必须符合DataFrame的长度。如果把一二series赋给DataFrame,会按DataFrameindex来赋值,不够的地方用缺失数据来表示:

val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7-1.2
three2002Ohio3.6NaN
four2001Nevada2.4-1.5
five2002Nevada2.9-1.7
six2003Nevada3.2NaN

如果列不存在,赋值会创建一个新列。而del也能像删除字典关键字一样,删除列:

frame2['eastern'] = frame2.state == 'Ohio'
frame2
yearstatepopdebteastern
one2000Ohio1.5NaNTrue
two2001Ohio1.7-1.2True
three2002Ohio3.6NaNTrue
four2001Nevada2.4-1.5False
five2002Nevada2.9-1.7False
six2003Nevada3.2NaNFalse

然后用del删除这一列:

del frame2['eastern']
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')

注意:columns返回的是一个view,而不是新建了一个copy。因此,任何对series的改变,会反映在DataFrame上。除非我们用copy方法来新建一个。

另一种常见的格式是dict中的dict

pop = {'Nevada': {2001: 2.4, 2002: 2.9},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}

把上面这种嵌套dict传给DataFrame,pandas会把外层dictkey当做列,内层key当做行索引:

frame3 = pd.DataFrame(pop)
frame3
NevadaOhio
2000NaN1.5
20012.41.7
20022.93.6

另外DataFrame也可以向numpy数组一样做转置:

frame3.T
200020012002
NevadaNaN2.42.9
Ohio1.51.73.6

指定index

pd.DataFrame(pop, index=[2001, 2002, 2003])
NevadaOhio
20012.41.7
20022.93.6
2003NaNNaN

series组成的dict

pdata = {'Ohio': frame3['Ohio'][:-1],'Nevada': frame3['Nevada'][:2]}
pd.DataFrame(pdata)
NevadaOhio
2000NaN1.5
20012.41.7

如果DataFrameindexcolumn有自己的name属性,也会被显示:

frame3.index.name = 'year'; frame3.columns.name = 'state'
frame3
stateNevadaOhio
year
2000NaN1.5
20012.41.7
20022.93.6

values属性会返回二维数组:

frame3.values
array([[ nan,  1.5],[ 2.4,  1.7],[ 2.9,  3.6]])

如果column有不同的类型,dtype会适应所有的列:

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],[2003, 'Nevada', 3.2, nan]], dtype=object)

3 Index Objects (索引对象)

pandasIndex Objects (索引对象)负责保存axis labels和其他一些数据(比如axis namenames)。一个数组或其他一个序列标签,只要被用来做构建seriesDataFrame,就会被自动转变为index

obj = pd.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 object是不可更改的:

index[1] = 'd'
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)<ipython-input-67-676fdeb26a68> in <module>()
----> 1 index[1] = 'd'/Users/xu/anaconda/envs/py35/lib/python3.5/site-packages/pandas/indexes/base.py in __setitem__(self, key, value)1243 1244     def __setitem__(self, key, value):
-> 1245         raise TypeError("Index does not support mutable operations")1246 1247     def __getitem__(self, key):TypeError: Index does not support mutable operations

正因为不可修改,所以data structure中分享index object是很安全的:

labels = pd.Index(np.arange(3))
labels
Int64Index([0, 1, 2], dtype='int64')
obj2 = pd.Series([1.5, -2.5, 0], index=labels)
obj2
0    1.5
1   -2.5
2    0.0
dtype: float64
obj2.index is labels
True

index除了想数组,还能像大小一定的set

frame3
stateNevadaOhio
year
2000NaN1.5
20012.41.7
20022.93.6
frame3.columns
Index(['Nevada', 'Ohio'], dtype='object', name='state')
'Ohio' in frame3.columns
True
2003 in frame3.columns
False

python里的set不同,pandasindex可以有重复的labels

dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])
dup_labels
Index(['foo', 'foo', 'bar', 'bar'], dtype='object')

在这种重复的标签中选择的话,会选中所有相同的标签。

pandas教程:Introduction to pandas Data Structures pandas的数据结构

文章目录

  • Chapter 5 Getting Started with pandas
  • 5.1 Introduction to pandas Data Structures
  • 1 Series
  • 2 DataFrame
  • 3 Index Objects (索引对象)

Chapter 5 Getting Started with pandas

这样导入pandas

import pandas as pd
e:\python3.7\lib\site-packages\numpy\_distributor_init.py:32: UserWarning: loaded more than 1 DLL from .libs:
e:\python3.7\lib\site-packages\numpy\.libs\libopenblas.TXA6YQSD3GCQQC22GEQ54J2UDCXDXHWN.gfortran-win_amd64.dll
e:\python3.7\lib\site-packages\numpy\.libs\libopenblas.XWYDX2IKJW2NMTWSFYNGFUWKQU3LYTCZ.gfortran-win_amd64.dllstacklevel=1)

另外可以导入SeriesDataFrame,因为这两个经常被用到:

from pandas import Series, DataFrame

5.1 Introduction to pandas Data Structures

数据结构其实就是SeriesDataFrame

1 Series

这里series我就不翻译成序列了,因为之前的所有笔记里,我都是把sequence翻译成序列的。

series是一个像数组一样的一维序列,并伴有一个数组表示label,叫做index。创建一个series的方法也很简单:

obj = pd.Series([4, 7, -5, 3])
obj
0    4
1    7
2   -5
3    3
dtype: int64

可以看到,左边表示index,右边表示对应的value。可以通过valueindex属性查看:

obj.values
array([ 4,  7, -5,  3], dtype=int64)
obj.index # like range(4)
RangeIndex(start=0, stop=4, step=1)

当然我们也可以自己指定indexlabel

obj2 = pd.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')

可以用indexlabel来选择:

obj2['a']
-5
obj2['d'] = 6
obj2[['c', 'a', 'd']]
c    3
a   -5
d    6
dtype: int64

这里[‘c’, ‘a’, ‘d’]其实被当做了索引,尽管这个索引是用string构成的。

使用numpy函数或类似的操作,会保留index-value的关系:

obj2[obj2 > 0]
d    6
b    7
c    3
dtype: int64
obj2 * 2
d    12
b    14
a   -10
c     6
dtype: int64
import numpy as np
np.exp(obj2)
d     403.428793
b    1096.633158
a       0.006738
c      20.085537
dtype: float64

另一种看待series的方法,它是一个长度固定,有顺序的dict,从index映射到value。在很多场景下,可以当做dict来用:

'b' in obj2
True
'e' in obj2
False

还可以直接用现有的dict来创建series

sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon':16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
obj3
Ohio      35000
Texas     71000
Oregon    16000
Utah       5000
dtype: int64

series中的index其实就是dict中排好序的keys。我们也可以传入一个自己想要的顺序:

states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = pd.Series(sdata, index=states)
obj4
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64

顺序是按states里来的,但因为没有找到california,所以是NaNNaN表示缺失数据,用之后我们提到的话就用missingNA来指代。pandas中的isnullnotnull函数可以用来检测缺失数据:

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

series也有对应的方法:

obj4.isnull()
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

关于缺失数据,在第七章还会讲得更详细一些。

series中一个有用的特色自动按index label来排序(Data alignment features):

obj3
Ohio      35000
Texas     71000
Oregon    16000
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

这个Data alignment features(数据对齐特色)和数据库中的join相似。

series自身和它的index都有一个叫name的属性,这个能和其他pandas的函数进行整合:

obj4.name = 'population'
obj4.index.name = 'state'
obj4
state
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64

seriesindex能被直接更改:

obj
0    4
1    7
2   -5
3    3
dtype: int64
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
obj
Bob      4
Steve    7
Jeff    -5
Ryan     3
dtype: int64

2 DataFrame

DataFrame表示一个长方形表格,并包含排好序的列,每一列都可以是不同的数值类型(数字,字符串,布尔值)。DataFrame有行索引和列索引(row index, column index);可以看做是分享所有索引的由series组成的字典。数据是保存在一维以上的区块里的。

(其实我是把dataframe当做excel里的那种表格来用的,这样感觉更直观一些)

构建一个dataframe的方法,用一个dcitdict里的值是list

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}frame = pd.DataFrame(data)frame
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002
53.2Nevada2003

dataframe也会像series一样,自动给数据赋index, 而列则会按顺序排好。

对于一个较大的DataFrame,用head方法会返回前5行(注:这个函数在数据分析中经常使用,用来查看表格里有什么东西):

frame.head()
popstateyear
01.5Ohio2000
11.7Ohio2001
23.6Ohio2002
32.4Nevada2001
42.9Nevada2002

如果指定一列的话,会自动按列排序:

pd.DataFrame(data, columns=['year', 'state', 'pop'])
yearstatepop
02000Ohio1.5
12001Ohio1.7
22002Ohio3.6
32001Nevada2.4
42002Nevada2.9
52003Nevada3.2

如果你导入一个不存在的列名,那么会显示为缺失数据:

frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'], index=['one', 'two', 'three', 'four', 'five', 'six'])
frame2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7NaN
three2002Ohio3.6NaN
four2001Nevada2.4NaN
five2002Nevada2.9NaN
six2003Nevada3.2NaN
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')

DataFrame里提取一列的话会返回series格式,可以以属性或是dict一样的形式来提取:

frame2['state']
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
six      Nevada
Name: state, dtype: object
frame2.year
one      2000
two      2001
three    2002
four     2001
five     2002
six      2003
Name: year, dtype: int64

注意:frame2[column]能应对任何列名,但frame2.column的情况下,列名必须是有效的python变量名才行。

返回的seriesDataFrame种同样的index,而且name属性也是对应的。

对于行,要用在loc属性里用 位置或名字:

frame2.loc['three']
year     2002
state    Ohio
pop       3.6
debt      NaN
Name: three, dtype: object

列值也能通过赋值改变。比如给debt赋值:

frame2['debt'] = 16.5
frame2
yearstatepopdebt
one2000Ohio1.516.5
two2001Ohio1.716.5
three2002Ohio3.616.5
four2001Nevada2.416.5
five2002Nevada2.916.5
six2003Nevada3.216.5
frame2['debt'] = np.arange(6.)
frame2
yearstatepopdebt
one2000Ohio1.50.0
two2001Ohio1.71.0
three2002Ohio3.62.0
four2001Nevada2.43.0
five2002Nevada2.94.0
six2003Nevada3.25.0

如果把listarray赋给column的话,长度必须符合DataFrame的长度。如果把一二series赋给DataFrame,会按DataFrameindex来赋值,不够的地方用缺失数据来表示:

val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2
yearstatepopdebt
one2000Ohio1.5NaN
two2001Ohio1.7-1.2
three2002Ohio3.6NaN
four2001Nevada2.4-1.5
five2002Nevada2.9-1.7
six2003Nevada3.2NaN

如果列不存在,赋值会创建一个新列。而del也能像删除字典关键字一样,删除列:

frame2['eastern'] = frame2.state == 'Ohio'
frame2
yearstatepopdebteastern
one2000Ohio1.5NaNTrue
two2001Ohio1.7-1.2True
three2002Ohio3.6NaNTrue
four2001Nevada2.4-1.5False
five2002Nevada2.9-1.7False
six2003Nevada3.2NaNFalse

然后用del删除这一列:

del frame2['eastern']
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')

注意:columns返回的是一个view,而不是新建了一个copy。因此,任何对series的改变,会反映在DataFrame上。除非我们用copy方法来新建一个。

另一种常见的格式是dict中的dict

pop = {'Nevada': {2001: 2.4, 2002: 2.9},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}

把上面这种嵌套dict传给DataFrame,pandas会把外层dictkey当做列,内层key当做行索引:

frame3 = pd.DataFrame(pop)
frame3
NevadaOhio
2000NaN1.5
20012.41.7
20022.93.6

另外DataFrame也可以向numpy数组一样做转置:

frame3.T
200020012002
NevadaNaN2.42.9
Ohio1.51.73.6

指定index

pd.DataFrame(pop, index=[2001, 2002, 2003])
NevadaOhio
20012.41.7
20022.93.6
2003NaNNaN

series组成的dict

pdata = {'Ohio': frame3['Ohio'][:-1],'Nevada': frame3['Nevada'][:2]}
pd.DataFrame(pdata)
NevadaOhio
2000NaN1.5
20012.41.7

如果DataFrameindexcolumn有自己的name属性,也会被显示:

frame3.index.name = 'year'; frame3.columns.name = 'state'
frame3
stateNevadaOhio
year
2000NaN1.5
20012.41.7
20022.93.6

values属性会返回二维数组:

frame3.values
array([[ nan,  1.5],[ 2.4,  1.7],[ 2.9,  3.6]])

如果column有不同的类型,dtype会适应所有的列:

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],[2003, 'Nevada', 3.2, nan]], dtype=object)

3 Index Objects (索引对象)

pandasIndex Objects (索引对象)负责保存axis labels和其他一些数据(比如axis namenames)。一个数组或其他一个序列标签,只要被用来做构建seriesDataFrame,就会被自动转变为index

obj = pd.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 object是不可更改的:

index[1] = 'd'
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)<ipython-input-67-676fdeb26a68> in <module>()
----> 1 index[1] = 'd'/Users/xu/anaconda/envs/py35/lib/python3.5/site-packages/pandas/indexes/base.py in __setitem__(self, key, value)1243 1244     def __setitem__(self, key, value):
-> 1245         raise TypeError("Index does not support mutable operations")1246 1247     def __getitem__(self, key):TypeError: Index does not support mutable operations

正因为不可修改,所以data structure中分享index object是很安全的:

labels = pd.Index(np.arange(3))
labels
Int64Index([0, 1, 2], dtype='int64')
obj2 = pd.Series([1.5, -2.5, 0], index=labels)
obj2
0    1.5
1   -2.5
2    0.0
dtype: float64
obj2.index is labels
True

index除了想数组,还能像大小一定的set

frame3
stateNevadaOhio
year
2000NaN1.5
20012.41.7
20022.93.6
frame3.columns
Index(['Nevada', 'Ohio'], dtype='object', name='state')
'Ohio' in frame3.columns
True
2003 in frame3.columns
False

python里的set不同,pandasindex可以有重复的labels

dup_labels = pd.Index(['foo', 'foo', 'bar', 'bar'])
dup_labels
Index(['foo', 'foo', 'bar', 'bar'], dtype='object')

在这种重复的标签中选择的话,会选中所有相同的标签。

发布评论

评论列表 (0)

  1. 暂无评论