自学内容网 自学内容网

人工智能研究生前置知识—扩展程序库Pandas

人工智能研究生前置知识—扩展程序库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

原文地址:https://blog.csdn.net/weixin_46167190/article/details/137746175

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!