python数据科学(六) Pandas(一) Pandas基本数据结构

本文最后更新于:2023年4月15日 晚上

python数据科学(六) Pandas(一)

Pandas是在NumPy的基础上建立的新程序库, 提供了一种高效的DataFrame数据结构, DataFrame本质上是一种带行标签和列标签, 支持相同类型数据和缺失值的多维数组

1 | Pandas的Series对象

Pandas的Series对象是一个带索引数据构成的一维数组, 可以一个数组创建Series对象

values和index:

和NumPy数组一样, 数据可以通过Python的中括号索引标签获取

Series和NumPy数组的本质差异其实是索引

NumPy数组通过隐式定义的整数索引获取数值, 而Pandas的Series对象用一种显式定义的索引与数值关联

显式索引的定义让Series可以让索引为任意想要的类型

如用字符串定义索引:

1
2
3
data = pd.Series([1, 2, 3],
index = ['a', 'b', 'c'])
data['a'] # 1

特殊的字典

Series对象可以被看成一种特殊的python字典, 可以直接用python字典创建一个Series对象

1
2
3
4
5
6
7
8
9
10
population_dict = {'a': 1,
'b': 2,
'c': 3}
population = pd.Series(population_dict)
"""
a 1
b 2
c 3
dtype: int64
"""

典型的获取字典值方式仍然有效:

1
population['b']  # 2

Series对象和字典不同的是, 还支持数组形式的操作, 如切片:

1
2
3
4
5
6
population['a': 'b']
"""
a 1
b 2
dtype: int64
"""

Series对象的创建方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1. 列表或numpy数组
pd.Series([1, 2, 3])

# 2. 标量
pd.Series(5, index = [100, 200, 300])
"""
100 5
200 5
300 5
dtype: int64
"""

# 3. 字典
pd.Series({2: 'a', 1: 'b', 3: 'c'})
"""
2 a
1 b
3 c
dtype: object
"""

# 4. Series对象只会保留显式定义的键值对
pd.Series({2: 'a', 1: 'b', 3: 'c'}, index = [3, 2])
"""
3 c
2 a
dtype: object
"""

2 | Pandas的DataFrame对象

Series: 一维

DataFrame: 二维

可以将DataFrame看作有序排列的若干Series对象

Series中一个键映射一个值, DataFrame中一个键映射一个Series

创建DataFrame对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 1. 通过单个Series对象创建
population = pd.Series(dict_population)
pd.DataFrame(population, columns = ['population'])
"""
population
湖南 1000
广东 2000
上海 10000
"""

# 2. 通过字典列表创建, 如果有些键不存在, Pandas也会用NaN代替(not a number)
pd.DataFrame([{'a': 1, 'b': 2}, {'a': 2, 'c': 3}])
"""
a b c
0 1 2.0 NaN
1 2 NaN 3.0
"""

# 3. 通过Series对象字典创建
dict_population = {"湖南": 1000, "广东": 2000, "上海": 10000}
dict_area = {"湖南": "1A", "广东": "2B", "上海": "3C"}
population = pd.Series(dict_population)
area = pd.Series(dict_area)
state = pd.DataFrame({'population': population, 'area': area})
"""
population area
湖南 1000 1A
广东 2000 2B
上海 10000 3C
"""

# 4. 通过NumPy二维数组创建, 如果行列不指定索引值, 那么都是整数索引
pd.DataFrame(np.random.rand(3, 2))
"""
0 1
0 0.931631 0.727243
1 0.796623 0.715634
2 0.730584 0.020360
"""
pd.DataFrame(np.random.rand(2, 3), columns = ['A', 'B', 'C'], index = ['aaa', 'bbb'])
"""
A B C
aaa 0.608391 0.362048 0.865072
bbb 0.768997 0.457158 0.885170
"""

# 5. 通过NumPy结构化数组创建
a = np.zeros(3, dtype=[('a', 'i8'), ('b', 'f8')])
a # array([(0, 0.), (0, 0.), (0, 0.)], dtype=[('a', '<i8'), ('b', '<f8')])
pd.DataFrame(a)
"""
a b
0 0 0.0
1 0 0.0
2 0 0.0
"""

3 | Pandas的Index对象

可以将Pandas的Index对象看作是一个不可变数组或有序集合(实际上是一个多集, 因为index对象可能会包含重复值)

1
2
3
4
5
ind = pd.Index(np.arange(1, 4))
ind
"""
Int64Index([1, 2, 3], dtype='int64')
"""

Index对象和numpy数组之间的差别是: Index对象的索引是不可变的, 也就是说不能通过通常的方式进行调整

将Index对象看成有序集合

Pandas对象涉及很多集合操作, Index对象遵循python标准库的集合数据结构的很多种习惯用法, 包括并, 交, 差等


python数据科学(六) Pandas(一) Pandas基本数据结构
https://blog.roccoshi.top/posts/53650/
作者
RoccoShi
发布于
2021年1月19日
许可协议