人工智能研究生前置知识—扩展程序库Pandas
pandas简介
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)。Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。
pandas的官网:https://pandas.pydata.org/
-
Series: 类似于一维数组或列表,是由一组数据以及与之相关的数据标签(索引)构成。Series 可以看作是 DataFrame 中的一列,也可以是单独存在的一维数据结构。
-
DataFrame: 类似于一个二维表格,它是 Pandas 中最重要的数据结构。DataFrame 可以看作是由多个 Series 按列排列构成的表格,它既有行索引也有列索引,因此可以方便地进行行列选择、过滤、合并等操作。
Pandas 提供了丰富的功能,包括:
- 数据清洗:处理缺失数据、重复数据等。
- 数据转换:改变数据的形状、结构或格式。
- 数据分析:进行统计分析、聚合、分组等。
- 数据可视化:通过整合 Matplotlib 和 Seaborn 等库,可以进行数据可视化。
Pandas常用数据结构
Series
Series 特点:
索引: 每个 Series 都有一个索引,它可以是整数、字符串、日期等类型。如果没有显式指定索引,Pandas 会自动创建一个默认的整数索引。
数据类型: Series 可以容纳不同数据类型的元素,包括整数、浮点数、字符串等。
pandas.Series( data, index, dtype, name, copy)
参数说明:
-
data:一组数据(ndarray 类型)。
-
index:数据索引标签,如果不指定,默认从 0 开始。
-
dtype:数据类型,默认会自己判断。
-
name:设置名称。
-
copy:拷贝数据,默认为 False。
import numpy as np
import pandas as pd
s = pd.Series([1,2,4,5,7,9])
print(s)
0 1
1 2
2 4
3 5
4 7
5 9
dtype: int64
输出的数据有索引、数值和数据类型组成
DataFrame
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
DataFrame 构造方法如下:
pandas.DataFrame( data, index, columns, dtype, copy)
参数说明:
-
data:一组数据(ndarray、series, map, lists, dict 等类型)。
-
index:索引值,或者可以称为行标签。
-
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
-
dtype:数据类型。
-
copy:拷贝数据,默认为 False。
-
Pandas DataFrame 是一个二维的数组结构,类似二维数组。
创建简单的实例操作
dates = pd.date_range('20160101',periods=6)
print(dates)
df = pd.DataFrame
(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
print(df)
DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04',
'2016-01-05', '2016-01-06'],
dtype='datetime64[ns]', freq='D')
a b c d
2016-01-01 -0.580792 -0.054259 -1.328131 -0.031686
2016-01-02 -0.015089 -0.364996 0.682357 -0.145403
2016-01-03 0.343227 1.725339 -1.515164 0.326085
2016-01-04 -0.593643 -0.352377 0.542772 -0.466898
2016-01-05 -2.323654 -0.690758 -0.113209 0.606809
2016-01-06 -1.801662 0.149519 -0.574387 -0.175300
- 使用ndarray数组进行创建
df1 = pd.DataFrame(np.arange(12).reshape(3,4))
print(df1)
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
- 使用字典数据来进行创建
print("------------------")
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df3 = pd.DataFrame(data)
print (df3)
------------------
Site Age
0 Google 10
1 Runoob 12
2 Wiki 13
示例二
df4 = pd.DataFrame({'A':1,'B':pd.Timestamp('20130102'),'C':pd.Series([1.0,2.0,3.0,4.0])})
print(df4)
# 每一列的数据类型
print(df4.dtypes)
# 打印行和列的索引
print(df4.index,df4.columns)
A B C
0 1 2013-01-02 1.0
1 1 2013-01-02 2.0
2 1 2013-01-02 3.0
3 1 2013-01-02 4.0
A int64
B datetime64[ns]
C float64
dtype: object
RangeIndex(start=0, stop=4, step=1)
Index(['A', 'B', 'C'], dtype='object')
注意可以使用不同数据类型的元素
-
获取列名 columns = df.columns
-
获取形状(行数和列数)shape = df.shape
-
获取索引 index = df.index
-
获取描述统计信息 stats = df.describe()
pandas选择数据
- 案例中使用到的数据结构
import numpy as np
import pandas as pd
dates = pd.date_range('20230101',periods=6)
df = pd.DataFrame(np.arange(24).reshape(6,4),index=dates,columns=['A','B','C','D'])
print(df)
A B C D
2023-01-01 0 1 2 3
2023-01-02 4 5 6 7
2023-01-03 8 9 10 11
2023-01-04 12 13 14 15
2023-01-05 16 17 18 19
2023-01-06 20 21 22 23
切片选择
对行进行切片选择
# 行切片选择第一行到第三行
print(df[0:3])
# 等价形式
print(df['2023-01-01':'2023-01-03'])
A B C D
2023-01-01 0 1 2 3
2023-01-02 4 5 6 7
2023-01-03 8 9 10 11
A B C D
2023-01-01 0 1 2 3
2023-01-02 4 5 6 7
2023-01-03 8 9 10 11
对列进行切片选择
print('===============')
# 对列进行切片选择
print(df['A'],df.A)
2023-01-01 0
2023-01-02 4
2023-01-03 8
2023-01-04 12
2023-01-05 16
2023-01-06 20
Freq: D, Name: A, dtype: int32 2023-01-01 0
2023-01-02 4
2023-01-03 8
2023-01-04 12
2023-01-05 16
2023-01-06 20
Freq: D, Name: A, dtype: int32
标签选择
选择指定的行,指定的列,和行列的交叉项
#横向标签
print(df.loc['2023-01-04'])
#纵向的标签进行选择
print(df.loc[:,['A','B']])
print('##############')
# 综合情况下的选择
print(df.loc[['2023-01-02','2023-01-03'],['A','B']])
A 12
B 13
C 14
D 15
Name: 2023-01-04 00:00:00, dtype: int32
A B
2023-01-01 0 1
2023-01-02 4 5
2023-01-03 8 9
2023-01-04 12 13
2023-01-05 16 17
2023-01-06 20 21
##############
A B
2023-01-02 4 5
2023-01-03 8 9
位置选择
使用.iloc进行根据位置来选择元素
print('--------------')
# 选择第三行元素
print(df.iloc[2])
#选择第三列元素
print(df.iloc[:,2])
# 选择第三行第三列的元素
print(df.iloc[2,2])
#与切片结合选择
print(df.iloc[1:3,2:3])
--------------
A 8
B 9
C 10
D 11
Name: 2023-01-03 00:00:00, dtype: int32
2023-01-01 2
2023-01-02 6
2023-01-03 10
2023-01-04 14
2023-01-05 18
2023-01-06 22
Freq: D, Name: C, dtype: int32
10
C
2023-01-02 6
2023-01-03 10
条件选择
print(df[df.A>8])
A B C D
2023-01-04 12 13 14 15
2023-01-05 16 17 18 19
2023-01-06 20 21 22 23
pandas设置值(修改操作)
- 案例中使用到的数据结构
import numpy as np
import pandas as pd
dates = pd.date_range('20230101',periods=6)
df = pd.DataFrame(np.arange(24).reshape(6,4),index=dates,columns=['A','B','C','D'])
print(df)
A B C D
2023-01-01 0 1 2 3
2023-01-02 4 5 6 7
2023-01-03 8 9 10 11
2023-01-04 12 13 14 15
2023-01-05 16 17 18 19
2023-01-06 20 21 22 23
修改操作即选择操作与赋值操作之间相结合
pandas处理丢失数据(简单数据清洗)
含有丢失数据的数据集合
import numpy as np
import pandas as pd
dates = pd.date_range('20230101',periods=6)
df = pd.DataFrame(np.arange(24).reshape(6,4),index=dates,columns=['A','B','C','D'])
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
print(df)
A B C D
2023-01-01 0 NaN 2.0 3
2023-01-02 4 5.0 NaN 7
2023-01-03 8 9.0 10.0 11
2023-01-04 12 13.0 14.0 15
2023-01-05 16 17.0 18.0 19
2023-01-06 20 21.0 22.0 23
处理一:丢失数据
# 行筛选丢失
print(df.dropna(axis=0,how='any')) #how={all,any}其中all所有元素都为空,any任何元素为空、
#列筛选丢失
print(df.dropna(axis=1,how='any'))
A B C D
2023-01-03 8 9.0 10.0 11
2023-01-04 12 13.0 14.0 15
2023-01-05 16 17.0 18.0 19
2023-01-06 20 21.0 22.0 23
A D
2023-01-01 0 3
2023-01-02 4 7
2023-01-03 8 11
2023-01-04 12 15
2023-01-05 16 19
2023-01-06 20 23
处理二:默认填充
实例测试默认将空值填充为0,首先要确认判断数据是否会有缺失的情况存在
print(df.isnull())
print('----------------')
# 判断是否存在数据的缺失
print(np.any(df.isnull()))
# 缺失的部分默认填充为0
print(df.fillna(value=0))
A B C D
2023-01-01 False True False False
2023-01-02 False False True False
2023-01-03 False False False False
2023-01-04 False False False False
2023-01-05 False False False False
2023-01-06 False False False False
----------------
True
A B C D
2023-01-01 0 0.0 2.0 3
2023-01-02 4 5.0 0.0 7
2023-01-03 8 9.0 10.0 11
2023-01-04 12 13.0 14.0 15
2023-01-05 16 17.0 18.0 19
2023-01-06 20 21.0 22.0 23
pandas导入导出数据
使用到的csv文件如下所示。
Student ID,name ,age,gender
1100,Kelly,22,Female
1101,Clo,21,Female
1102,Tilly,22,Female
1103,Tony,24,Male
1104,David,20,Male
1105,Catty,22,Female
1106,M,3,Female
1107,N,43,Male
1108,A,13,Male
1109,S,12,Male
1110,David,33,Male
1111,Dw,3,Female
1112,Q,23,Male
读取csv文件
import pandas as pd
data = pd.read_csv('student.csv')
print(data)
Student ID name age gender
0 1100 Kelly 22 Female
1 1101 Clo 21 Female
2 1102 Tilly 22 Female
3 1103 Tony 24 Male
4 1104 David 20 Male
5 1105 Catty 22 Female
6 1106 M 3 Female
7 1107 N 43 Male
8 1108 A 13 Male
9 1109 S 12 Male
10 1110 David 33 Male
11 1111 Dw 3 Female
12 1112 Q 23 Male
13 1113 W 21 Female
导出文件(csv)
将读取后的csv文件导出为excel格式的文件
data.to_excel(‘student.xlsx’,index=False)
# 三个字段 name, site, age
nme = ["Google", "Runoob", "Taobao", "Wiki"]
st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
ag = [90, 40, 80, 98]
# 字典
dict = {'name': nme, 'site': st, 'age': ag}
df = pd.DataFrame(dict)
# 保存 dataframe
df.to_csv('site.csv')
pandas数据合并
按行进行合并操作(axis=0)
使用到的待合并的数据集
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
print(df1)
print(df2)
print(df3)
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
a b c d
0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
a b c d
0 2.0 2.0 2.0 2.0
1 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0
# 使用concat按行来进行合并
res = pd.concat([df1,df2,df3],axis=0,ignore_index=False)
print(res)
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
0 2.0 2.0 2.0 2.0
1 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0