目录
前言
pandas经常和其他数值计算工具一起使用,如numpy ,SciPy,matplotlib等。pandas与numpy最大的不同在于pandas是用来处理表格型或异质型数据的,而numpy是用来处理同质型的数值类数组数据。
一、pandas数据结构介绍
首先了解两个常用的工具数据结构:Series 和 DataFrame。
1. Series
series是一种一维的数组型对象,它包含了一个值序列(与 numpy 中的类型相似),并且包含了数据标签,称为索引。
示例:
import pandas as pd
obj = pd.Series([4, 7, -5, 3])
print(obj)
结果:
0 4
1 7
2 -5
3 3
dtype: int64
由于没有指定索引,因此默认索引从0到 n-1。可以通过values属性和index属性分别获取值和索引。
示例:
import pandas as pd
obj = pd.Series([4, 7, -5, 3])
print(obj)
print(obj.values)
print(obj.index)
结果:
0 4
1 7
2 -5
3 3
dtype: int64
[ 4 7 -5 3]
RangeIndex(start=0, stop=4, step=1)
通常需要创建一个索引序列,用标签标识每个数据点
示例
import pandas as pd
import numpy as np
obj = pd.Series([4, 7, -5, 3], index = ['a', 'b', 'c', 'd'])
print(obj)
#搞个花活,学生成绩单
data = np.random.randint(70, 100, size = 10)
name = ['abc', 'bcd', 'cde', 'def', 'efg', 'fgh', 'ghi', 'hij', 'ijk', 'jkl']
exam = pd.Series(data, index = name)
print(exam)
结果:
a 4
b 7
c -5
d 3
dtype: int64
abc 90
bcd 77
cde 91
def 85
efg 83
fgh 96
ghi 90
hij 70
ijk 87
jkl 93
dtype: int32
与numpy相比,可以在从数据中选择数据时使用标签来进行索引。
示例:
import pandas as pd
import numpy as np
obj = pd.Series([4, 7, -5, 3], index = ['a', 'b', 'c', 'd'])
print(obj)
#索引部分
print('obj["a"]is : ')
print(obj['a'])
print('a, c, d is : ')
print(obj[['a', 'c', 'd']])#注意此处一定要有两个方括号
obj['b'] = 10000
print(obj)
结果:
a 4
b 7
c -5
d 3
dtype: int64
obj["a"]is :
4
a, c, d is :
a 4
c -5
d 3
dtype: int64
a 4
b 10000
c -5
d 3
注意:
['a', 'c', 'd']作为索引列表,包含的不是数字,而是字符串。因此该行代码一定要有两个方括号。
当使用numpy函数及其操作时,仍会保存索引值。
示例:
import pandas as pd
import numpy as np
obj = pd.Series([4, 7, -5, 3], index = ['a', 'b', 'c', 'd'])
#布尔值
a = obj[obj > 0]
print('a is :')
print(a)
#加减乘除
b = obj * 2
print('b is :')
print(b)
c = np.exp(obj)
print('c is :')
print(c)
d = np.sin(obj)
print('d is :')
print(d)
结果:
a is :
a 4
b 7
d 3
dtype: int64
b is :
a 8
b 14
c -10
d 6
dtype: int64
c is :
a 54.598150
b 1096.633158
c 0.006738
d 20.085537
dtype: float64
d is :
a -0.756802
b 0.656987
c 0.958924
d 0.141120
dtype: float64
从另一个角度考虑,他是一个长度固定且有序的字典,他将索引值和数据值按照位置配对。因此,可以利用已有的字典生成一个Series。
示例:
import pandas as pd
import numpy as np
data = {'ohio': 35000, 'texas': 71000, 'oregon': 16000}
obj = pd.Series(data)
print(obj)
结果:
ohio 35000
texas 71000
oregon 16000
dtype: int64
当我们把字典传递给Series构造函数时,产生的Series的索引将是排序好的字典键。
示例:
import pandas as pd
import numpy as np
data = {'ohio': 35000, 'texas': 71000, 'oregon': 16000}
state = ['California', 'Mexico', 'oregon']
obj = pd.Series(data, index = state)
print(obj)
结果:
California NaN
Mexico NaN
oregon 16000.0
dtype: float64
重点关注结果:
由于在 state 中,前两个没有出现在data键中,因此他们的对应值为NaN,第三个出现了,有正确的对应值。
进一步分析,pandas 中使用 insull 和 notnull 函数来检查缺失数据
示例:
import pandas as pd
import numpy as np
data = {'ohio': 35000, 'texas': 71000, 'oregon': 16000}
state = ['California', 'Mexico', 'oregon']
obj = pd.Series(data, index = state)
print(obj)
print()
print(pd.isnull(obj))
print()
print(pd.notnull(obj))
结果:
California NaN
Mexico NaN
oregon 16000.0
dtype: float64
California True
Mexico True
oregon False
dtype: bool
California False
Mexico False
oregon True
dtype: bool
Series 对象自身和其索引都有name属性。
示例:
import pandas as pd
data = {'ohio': 35000, 'texas': 71000, 'oregon': 16000}
obj = pd.Series(data)
obj.name = 'population'
obj.index.name = 'state'
print(obj)
结果:
state
ohio 35000
texas 71000
oregon 16000
Name: population, dtype: int64
分析:简单地说,就是给索引和整个部分进行命名。
Series 可以通过按位置赋值的方式进行改变。
示例:
import pandas as pd
data = {'ohio': 35000, 'texas': 71000, 'oregon': 16000}
state = ['Astrilia', 'Mexico', 'China']
obj = pd.Series(data)
obj.name = 'population'
obj.index.name = 'state'
print(obj)
print()
obj.index = state
print(obj)
结果:
state
ohio 35000
texas 71000
oregon 16000
Name: population, dtype: int64
Astrilia 35000
Mexico 71000
China 16000
Name: population, dtype: int64
2. DataFrame
DataFrame 表示的是矩阵的数据表,包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它的数据被存储为一个以上的二位快,而不是列表、字典或一维数组的集合。
常用构建DataFrame的方式是利用包含等长度列表或numpy 数组的字典来形成。
示例:
import pandas as pd
data = {'state': ['Astrilia', 'Mexico', 'China'],
'years': [2000, 2001, 2002],
'pop': [1.5, 3.6, 2.4]}
frame = pd.DataFrame(data)
print(frame)
结果:
state years pop
0 Astrilia 2000 1.5
1 Mexico 2001 3.6
2 China 2002 2.4
当没有指定每一列在哪里时,是随机的,也可以指定:
示例:
import pandas as pd
data = {'state': ['Astrilia', 'Mexico', 'China'],
'years': [2000, 2001, 2002],
'pop': [1.5, 3.6, 2.4]}
frame = pd.DataFrame(data, columns = ['years', 'state', 'pop'])
print(frame)
结果:
years state pop
0 2000 Astrilia 1.5
1 2001 Mexico 3.6
2 2002 China 2.4
DataFrame 中的一列,可以按字典型标记那样检索为Series
示例:
import pandas as pd
data = {'state': ['Astrilia', 'Mexico', 'China'],
'years': [2000, 2001, 2002],
'pop': [1.5, 3.6, 2.4]}
frame = pd.DataFrame(data, columns = ['years', 'state', 'pop'])
print(frame['state'])
print(frame.years)
结果:
0 Astrilia
1 Mexico
2 China
Name: state, dtype: object
0 2000
1 2001
2 2002
Name: years, dtype: int64
总结
今天主要学习了pandas的数据结构,包括 Series 和 DataFrame。DataFrame没有学完,明天继续。