Skip to main content

数据结构

import pandas as pd

Series

类似一维数组:

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

左侧为索引(index),右侧为值(value)

可以通过 Seriesvaluesindex 属性查看其值的数组形式和索引对象。

>>> obj.values
array([ 4, 7, -5, 3])
>>> obj.index
RangeIndex(start=0, stop=4, step=1)

创建 Series指定索引

>>> 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')
可通过索引值选取 Series 中的单个或一组值
>>> obj[2]
-5
>>> obj2['d']
4
>>> obj2[['b','a','c']]
b 7
a -5
c 3
dtype: int64
索引可以通过赋值的方式修改
>>> obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
>>> obj
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
根据值进行过滤
>>> obj2[obj2 > 0]
d 4
b 7
c 3
dtype: int64
计算
>>> obj2 * 2
d 8
b 14
a -10
c 6
dtype: int64

通过 字典 创建 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

DataFrame

表格型数据结构。

>>> 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
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2
head() 方法会选取前五行
>>> frame.head()
state year pop
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9

如果指定了列序列,则 DataFrame 的列就会按照指定顺序进行排列:

>>> pd.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
5 2003 Nevada 3.2

如果传入的列在数据中找不到,就会在结果中产生缺失值:

>>> frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],index=['one', 'two', 'three', 'four','five', 'six'])
>>> 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
six 2003 Nevada 3.2 NaN
info

values 属性也会以二维 ndarray 的形式返回 DataFrame 中的数据:

>>> frame.values
array([['Ohio', 2000, 1.5],
['Ohio', 2001, 1.7],
['Ohio', 2002, 3.6],
['Nevada', 2001, 2.4],
['Nevada', 2002, 2.9],
['Nevada', 2003, 3.2]], dtype=object)
info

如果设置了 DataFrameindexcolumnsname 属性,则这些信息也会被显示出来:

>>> frame.index.name = 'num';
>>> frame.columns.name = 'state';
>>> frame
state state year pop
num
0 Ohio 2000 1.5
1 Ohio 2001 1.7
2 Ohio 2002 3.6
3 Nevada 2001 2.4
4 Nevada 2002 2.9
5 Nevada 2003 3.2

列获取

通过类似字典标记的方式或属性的方式,可以将 DataFrame 的列获取为一个 Series

>>> 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['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
six 2003 Nevada 3.2 16.5

>>> frame2['debt'] = np.arange(6.)
>>> 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
six 2003 Nevada 3.2 5.0
caution

将列表或数组赋值给某个列时,其长度必须跟 DataFrame 的长度相匹配。

如果赋值的是一个 Series,就会精确匹配 DataFrame 的索引,所有的空位都将被填上缺失值:

>>> 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
six 2003 Nevada 3.2 NaN

删除列

关键字 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
six 2003 Nevada 3.2 NaN False

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