0%

浅谈Pandas之Series

这里介绍Pandas中的核心数据结构——Series

abstract.png

楔子

Pandas 是一个重要的Python三方库,其可以非常方便的进行数据处理、分析。其底层实现依赖于NumPy。而Series 则是 Pandas 中非常重要的基础数据结构。其是一个一维数组,同时具有名称Name、行索引Index。前者表明了其中数据的含义;后者则方便我们进行索引访问,行索引默认从0开始

创建

通过列表创建Series

1
2
3
4
5
6
7
8
import pandas as pd

list = [45, 25, 17]
# 行索引
index = ["k1", "k2", "k3"]
s = pd.Series(data=list, index=index, dtype='float32', name="price")
print(f"s 类型: {type(s)}")
print(f"s 数据:\n{s}")

输出:

1
2
3
4
5
6
s 类型: <class 'pandas.core.sEries.series'>
s 数据:
k1 45.0
k2 25.0
k3 17.0
Name: price, dtype: float32

通过字典创建Series

1
2
3
4
5
6
7
8
9
10
import pandas as pd

# key为行索引,value为数据
dict = {
"k1":45,
"k2":25,
"k3":17,
}
s = pd.Series(dict, name="price")
print(f"s:\n{s}")

输出:

1
2
3
4
5
s:
k1 45
k2 25
k3 17
Name: price, dtype: int64

通过NumPy数组创建Series

1
2
3
4
5
6
7
8
import pandas as pd
import numpy as np

array = np.array( ["45","25","17"] )
# 行索引
index = ["k1", "k2", "k3"]
s = pd.Series(array, name="price", dtype='float32', index=index)
print(f"s:\n{s}")

输出:

1
2
3
4
5
s:
k1 45.0
k2 25.0
k3 17.0
Name: price, dtype: float32

基本信息

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
import pandas as pd
import numpy as np

dict = {
"k1":45,
"k2":25,
"k3":np.nan,
"k4":17,
}
s = pd.Series(dict, name="price", dtype="float64")

print(f"s:\n{s}")
print(f"\n形状: {s.shape}")

# 将数据类型从 float64 修改为 float32
s = s.astype("float32")
print(f"\n数据类型: {s.dtype}")

print(f"\n名称: {s.name}")
print(f"\n行索引: {s.index}")

# 获取数据部分(NumPy数组格式)
data = s.values
print(f"\n数据内容的类型: {type(data)}, 数据内容: {data}\n")

print("#"*10, " 基本信息 ", "#"*20)
print(s.info())
print("#"*42,"\n")

print("#"*10, " 统计信息 ", "#"*20)
print(s.describe())
print("#"*42)

输出:

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
s:
k1 45.0
k2 25.0
k3 NaN
k4 17.0
Name: price, dtype: float64

形状: (4,)

数据类型: float32

名称: price

行索引: Index(['k1', 'k2', 'k3', 'k4'], dtype='object')

数据内容的类型: <class 'numpy.ndarray'>, 数据内容: [45. 25. nan 17.]

########## 基本信息 ####################
<class 'pandas.core.series.Series'>
Index: 4 entries, k1 to k4
Series name: price
Non-Null Count Dtype
-------------- -----
3 non-null float32
dtypes: float32(1)
memory usage: 48.0+ bytes
None
##########################################

########## 统计信息 ####################
count 3.000000
mean 29.000000
std 14.422205
min 17.000000
25% 21.000000
50% 25.000000
75% 35.000000
max 45.000000
Name: price, dtype: float64
##########################################

转换

Series转换为Python列表

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np


dict = {
"k1":45,
"k2":25,
"k3":np.nan,
"k4":17,
}
s = pd.Series(dict, name="price", dtype="float64")
list = s.to_list()
print(f"list 类型: {type(list)}, 数据: {list}")

输出:

1
list 类型: <class 'list'>, 数据: [45.0, 25.0, nan, 17.0]

Series转换为DataFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
import pandas as pd
import numpy as np


dict = {
"k1":45,
"k2":25,
"k3":np.nan,
"k4":17,
}
s = pd.Series(dict, name="price", dtype="float64")
df = s.to_frame()
print(f"\ndf 类型: {type(df)}, 数据: \n{df}")

输出:

1
2
3
4
5
6
df 类型: <class 'pandas.core.FramE.dataframe'>, 数据: 
price
k1 45.0
k2 25.0
k3 NaN
k4 17.0

索引

索引 []

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd


dict = {
"k1":45,
"k2":25,
"k3":39,
"k4":17,
"k5":88,
}
s = pd.Series(dict, name="price", dtype="float64")

# 使用 s[行索引/行索引列表] 方式
v1 = s["k2"]
print(f"\nv1 类型: {type(v1)}, 数据: \n{v1}")

s1 = s[ ["k5","k1"] ]
print(f"\ns1 类型: {type(s1)}, 数据: \n{s1}")

# 使用 布尔索引Series/列表 筛选出True对应的元素
row_condition = [True,True,False,False,True]
s2 = s[ row_condition ]
print(f"\ns2 类型: {type(s2)}, 数据: \n{s2}")

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
v1 类型: <class 'numpy.float64'>, 数据: 
25.0

s1 类型: <class 'pandas.core.series.Series'>, 数据:
k5 88.0
k1 45.0
Name: price, dtype: float64

s2 类型: <class 'pandas.core.series.Series'>, 数据:
k1 45.0
k2 25.0
k5 88.0
Name: price, dtype: float64

标签索引 loc[]

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
import pandas as pd
import numpy as np


dict = {
"k1":45,
"k2":25,
"k3":np.nan,
"k4":17,
}
s = pd.Series(dict, name="price", dtype="float64")

# 使用单个标签获取对应的值
print(f"s.loc['k2']: {s.loc['k2']}, 类型: {type(s.loc['k2'])}")
print(f"s.loc['k4']: {s.loc['k4']}, 类型: {type(s.loc['k4'])}")

# 使用 标签列表 获取多个值, 其返回的是一个新的Series
s2 = s.loc[['k2','k4']]
print(f"\ns2 类型: {type(s2)}, 数据: \n{s2}")

# 切片: 其返回的是一个 从开始标签(包含)到结束标签(包含)的Series
s3 = s.loc['k2':'k4']
print(f"\ns3 类型: {type(s3)}, 数据: \n{s3}")

# 布尔索引: 使用 布尔Series/布尔列表 选择对应位置为True的元素, 其返回的是一个Series
bool_mask1 = s > 20
s4 = s.loc[ bool_mask1 ]
print(f"\nbool_mask1 类型: {type(bool_mask1)}, 数据: \n{bool_mask1}")
print(f"\ns4 类型: {type(s4)}, 数据: \n{s4}")

bool_mask2 = [True, False, True, False]
s5 = s.loc[ bool_mask2 ]
print(f"\nbool_mask2 类型: {type(bool_mask2)}, 数据: \n{bool_mask2}")
print(f"\ns5 类型: {type(s5)}, 数据: \n{s5}")

输出:

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
s.loc['k2']: 25.0, 类型: <class 'numpy.float64'>
s.loc['k4']: 17.0, 类型: <class 'numpy.float64'>

s2 类型: <class 'pandas.core.series.Series'>, 数据:
k2 25.0
k4 17.0
Name: price, dtype: float64

s3 类型: <class 'pandas.core.series.Series'>, 数据:
k2 25.0
k3 NaN
k4 17.0
Name: price, dtype: float64

bool_mask1 类型: <class 'pandas.core.series.Series'>, 数据:
k1 True
k2 True
k3 False
k4 False
Name: price, dtype: bool

s4 类型: <class 'pandas.core.series.Series'>, 数据:
k1 45.0
k2 25.0
Name: price, dtype: float64

bool_mask2 类型: <class 'list'>, 数据:
[True, False, True, False]

s5 类型: <class 'pandas.core.series.Series'>, 数据:
k1 45.0
k3 NaN
Name: price, dtype: float64

物理位置索引 iloc[]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pandas as pd
import numpy as np


dict = {
"k1":45,
"k2":25,
"k3":np.nan,
"k4":17,
}
s = pd.Series(dict, name="price", dtype="float64")

# 基于物理位置索引(从0开始计数),从0开始计数
# 使用单个位置获取对应的值
print(f"s.iloc[1]: {s.iloc[1]}, 类型: {type(s.iloc[1])}")
print(f"s.iloc[3]: {s.iloc[3]}, 类型: {type(s.iloc[3])}")

# 使用 多个位置组成的列表 获取多个值, 其返回的是一个新的Series
s2 = s.iloc[[1,3]]
print(f"\ns2 类型: {type(s2)}, 数据: \n{s2}")

# 切片: 其返回的是一个 从开始位置(包含)到结束位置(不包含)的Series
s3 = s.iloc[1:3]
print(f"\ns3 类型: {type(s3)}, 数据: \n{s3}")

输出:

1
2
3
4
5
6
7
8
9
10
11
12
s.iloc[1]: 25.0, 类型: <class 'numpy.float64'>
s.iloc[3]: 17.0, 类型: <class 'numpy.float64'>

s2 类型: <class 'pandas.core.series.Series'>, 数据:
k2 25.0
k4 17.0
Name: price, dtype: float64

s3 类型: <class 'pandas.core.series.Series'>, 数据:
k2 25.0
k3 NaN
Name: price, dtype: float64
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝