Pandas的数据结构

Pandas

Pandas是Python的一个开源数据分析库,用作数据分析,有两个数据结构:Series、DataFrame

Series:一维数组,可以保存任何数据类型(整数、字符串、浮点数、Python对象等),Series带有索引,目前可以理解为一列数据。
DataFrame:二维表格型数据结构,可以看作是由Series组成的字典对象。DataFrame既有行索引也有列索引,它可以被看作是一个共享相同索引的多个Series对象的集合。

上图为通过pandas读取数据集展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:

  • DataFrame

    • Series

      • 索引列

        • 索引名、索引值

        • 索引下标、行号

      • 数据列

        • 列名

        • 列下标

        • 列值,具体的数据

其中最核心的就是Pandas中的两个数据结构:DataFrameSeries

 

Series对象

  • Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;一般是DataFrame的列对象,series本身也具有行索引。

  • Series是一种类似于一维数组的对象,由下面两个部分组成:

    • values:一组数据(numpy.ndarray类型)

    • index:相关的数据行索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。

 

数据类型

Pandas的Series数据结构可以容纳多种数据类型,以下是一些常见的数据类型:

  1. 整数类型 (Integer Types)

    • int8, int16, int32, int64: 这些是Pandas支持的整数类型,根据数据的范围和内存使用情况进行选择。默认情况下,整数数据通常会被存储为int64

  2. 浮点类型 (Floating-Point Types)

    • float16, float32, float64: 这些是用于存储浮点数的类型,根据精度和内存需求来选择。默认情况下,浮点数数据通常会被存储为float64

  3. 对象类型 (Object Type)

    • object: 用于存储字符串、混合类型数据或Python对象。这是非常灵活的数据类型,但可能会降低某些操作的性能。

  4. 布尔类型 (Boolean Type)

    • bool: 用于存储布尔值(True或False)。

  5. 日期和时间类型 (Datetime Types)

    • datetime64[ns]: 用于存储日期和时间数据,精确到纳秒。Pandas提供了丰富的日期和时间处理功能。

创建Series对象

通过numpy.ndarray来创建
  • 自动生成索引

      import numpy as np
      import pandas as pd
      
      # 创建numpy.ndarray对象
      n1 = np.array([1, 2, 3])
      print(n1)
      print(type(n1))
      
      # 创建Series对象
      s1 = pd.Series(data=n1)
      print(s1)
      print(type(s1))
      
      # 输出结果如下:
      [1 2 3]
      <class 'numpy.ndarray'>
      0    1
      1    2
      2    3
      dtype: int64
      <class 'pandas.core.series.Series'>
    import numpy as np
    import pandas as pd
    
    # 1、创建numpy数组
    print('------数组---------')
    n1_array = np.array([1,2,3,4,5])   # 将Python的列表转为numpy数组
    print(n1_array)
    
    # 2、根据数组来得到series对象
    print('-----series对象---------')    # series对象 =  一列数据  + 行索引
    """
     1、pandas 会将数组转为一列数据
     2、pandas会自动的在列前边加上行索引,行索引默认从0开始
    """
    s1 = pd.Series(n1_array)
    
    print(s1)

    指定索引

    import numpy as np
    import pandas as pd
    
    # 创建numpy.ndarray对象
    n1 = np.array([1, 2, 3])
    
    # 创建Series对象, 同时指定索引
    s1 = pd.Series(data=n1, index=['A', 'B', 'C'])
    print(s1)
    print(type(s1))
    
    # 输出结果如下:
    A    1
    B    2
    C    3
    dtype: int64
    <class 'pandas.core.series.Series'>
    import numpy as np
    import pandas as pd
    
    # 1、创建numpy数组
    print('------数组---------')
    n1_array = np.array([1,2,3,4,5])   # 将Python的列表转为numpy数组
    print(n1_array)
    
    # 2、根据数组来得到Series对象
    print('-----series对象---------')    # series对象 =  一列数据  + 行索引
    """
     1、pandas 会将数组转为一列数据
     2、pandas会自动的在列前边加上行索引,行索引默认从0开始
     3、打印出来的dtype: int64 是这一列的数据类型
    """
    # s1 = pd.Series(n1_array,['a','b','c','d','e'])  # 位置传参
    s1 = pd.Series(data = n1_array,index=['a','b','c','d','e'])  # 关键字传入参数
    
    print(s1)
    通过list列表来创建
  • 如果传入的数据类型是统一的数字,那么最终的dtype类型是int64

  • 如果传入的数据类型是统一的字符串,那么最终的dtype类型是object

  • 如果传入的数据类型是多种类型,那么最终的dtype类型也是object

import numpy as np
import pandas as pd


# 2、根据列表来得到Series对象
print('-----Series对象:使用默认索引---------')    # series对象 =  一列数据  + 行索引

s1 = pd.Series([1,2,3,4,5])  #   dtype: int64   通过列表得到Series对象
print(s1)
s2 = pd.Series([1,'hello',3,4,True])  # dtype: object 通过列表得到Series对象
print(s2)

print('-----Series对象:使用手动索引---------') 
s3 = pd.Series(data=[1,'hello',3,4,True],index=['a','b','c','d','e'])  # dtype: object 通过列表得到Series对象
print(s3)
通过字典或元组创建s对象
import pandas as pd

# 通过元组来生成s对象
print('---------通过元组来生成s对象-------------')
s1 = pd.Series((1, 2, 3, 4, 5))
print(s1)

# 通过字典来生成s对象
print('---------通过字典来生成s对象-------------')
# 默认将字典的键作为行索引,值当做一列
s2 = pd.Series({'name':'刘备','age':23,'gender':'男'})
print(s2)

Series对象常用属性和方法

 

import pandas as pd

# 创建s对象
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)
print('=================== 常用属性 ===================')
# 查看s对象值数量,就是查看有多少行函数
print(s1.size)
# 查看s对象维度, 返回一个单个元素的元组, 元素个数代表维度数, 元素值代表值数量
# (行数,列数),由于s对象时一维的,只显示行数,如果以后使用DataFrame来调用,则是二维的,既有行,又有列
print(s1.shape)  # (6,)
# 查看s对象数据类型
print(s1.dtypes)
print(s1.dtype)

# 获取s对象的数据值, 返回numpy的ndarray数组类型
print(s1.values)  #   [1 2 3 4 2 3]  本质上是一个numpy 数组
print(type(s1.values))  #  <class 'numpy.ndarray'>

# 获取s对象的索引
# 前边是索引值,dtype是索引值类型,这里是字符串(object)
print(s1.index)  # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')

print('=================== 常用方法 ===================')
# 查看s对象值数量
print(len(s1))
# 查看s对象前5个值, n默认等于5
print(s1.head())  # 查询前5行数据
print(s1.head(n=2))  # 设置查询前2行数据

# 查看s对象后5个值, n默认等于5
print(s1.tail())   # 查询后5行数据
print(s1.tail(n=2))  # 设置查询后2行数据
# 获取s对象的索引
print(s1.keys())   # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
# s对象转换成python列表
print(s1.tolist())
print(s1.to_list())  # 作用同上
# s对象转换成DataFrame对象
print(s1.to_frame())
print(s1.to_frame().shape  # (6,1) 输出是一个二维信  表格有6行1列
# s对象中数据的基础统计信息
print(s1.describe())
"""
count: 数据集中的元素数量。在这里是6。
mean: 数据集的平均值。所有数值相加后除以数值的数量。在这里是2.5。
std:  数据集的标准差。它描述了数值相对于平均值的离散程度。在这里是1.048809。
min:  数据集中的最小值。在这里是1。
25%:  数据集的四分位数(或百分位数)的第25个值。它表示有25%的数据小于或等于这个值。在这里是2。
50%:  数据集的中位数。它表示有一半的数据小于这个值,另一半大于这个值。在这里是2.5。
75%:  数据集的四分位数(或百分位数)的第75个值。它表示有75%的数据小于或等于这个值。在这里是3。
max:  数据集中的最大值。在这里是4。
"""
# s对象最大值、最小值、平均值、求和值...
print(s1.max())
print(s1.min())
print(s1.mean())
print(s1.sum())
# s对象数据值去重, 返回s对象
print(s1.drop_duplicates())
      
# s对象数据值去重, 返回数组
print(s1.unique())
# s对象数据值排序, 默认升序
print(s1.sort_values(ascending=True))
# s对象索引值排序, 默认升序
print(s1.sort_index(ascending=False))
# s对象不同值的数量, 类似于分组计数操作
print(s1.value_counts())  # select 数字,count(*) from 表  group by 数字;

布尔值列表获取Series数据

scientists.csv数据集中,列出大于Age列的平均值的具体值,具体步骤如下:

import pandas as pd

# 将CSV文件数据读取到DataFrame中
df = pd.read_csv('data/scientists.csv')
print(df)
# print(df.head())
# 输出结果如下
                   Name        Born        Died  Age          Occupation
0     Rosaline Franklin  1920-07-25  1958-04-16   37             Chemist
1        William Gosset  1876-06-13  1937-10-16   61        Statistician
2  Florence Nightingale  1820-05-12  1910-08-13   90               Nurse
3           Marie Curie  1867-11-07  1934-07-04   66             Chemist
4         Rachel Carson  1907-05-27  1964-04-14   56           Biologist
5             John Snow  1813-03-15  1858-06-16   45           Physician
6           Alan Turing  1912-06-23  1954-06-07   41  Computer Scientist
7          Johann Gauss  1777-04-30  1855-02-23   77       Mathematicia

 计算Age列的平均值

# 获取一列数据 df[列名]
ages = df['Age']
print(ages)
print(type(ages))
print(ages.mean())

# 输出结果如下
0    37
1    61
2    90
3    66
4    56
5    45
6    41
7    77
Name: Age, dtype: int64
<class 'pandas.core.series.Series'>
59.125

输出大于Age列的平均值的具体值

print(ages[ages > ages.mean()])

# 输出结果如下
1    61
2    90
3    66
7    77
Name: Age, dtype: int64
new_ages_s = ages > ages.mean()
print(new_ages_s) # series对象
print(new_ages_s.values)  # numpy的ndarray数据类型
print(list(new_ages_s.values))  # python的list数据类型

# 输出结果如下
0    False
1     True
2     True
3     True
4    False
5    False
6    False
7     True
Name: Age, dtype: bool
[False  True  True  True False False False  True]
[False, True, True, True, False, False, False, True]

Series对象的运算

Series和数值型变量计算时,变量会与Series中的每个元素逐一进行计算;

两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充。

  • Series和数值型变量计算

    # 加法
    print(ages + 10)  # 将age这个s对象的每一行都+10
    # 乘法
    print(ages * 2)
    
    # 输出结果如下
    0     47
    1     71
    2    100
    3     76
    4     66
    5     55
    6     51
    7     87
    Name: Age, dtype: int64
    0     74
    1    122
    2    180
    3    132
    4    112
    5     90
    6     82
    7    154
    Name: Age, dtype: int64

    两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充

  • print(ages + ages)
    print('=' * 20)
    print(pd.Series([1, 100]))  #  将列表转为s对象
    print('=' * 20)
    print(ages + pd.Series([1, 100]))  #  将两个s对象进行相加:索引能匹配则相加,不能匹配则补充维NaN
    
    # 输出结果如下
    0     74
    1    122
    2    180
    3    132
    4    112
    5     90
    6     82
    7    154
    Name: Age, dtype: int64
    ====================
    0      1
    1    100
    dtype: int64
    ====================
    0     38.0
    1    161.0
    2      NaN
    3      NaN
    4      NaN
    5      NaN
    6      NaN
    7      NaN
    dtype: float64

    3 DataFrame对象

    DataFrame是一个表格型的==结构化==数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。

    • DataFrame是Pandas中的最基本的数据结构对象,简称df;可以认为df就是一个二维数据表,这个表有行有列有索引

    • DataFrame是Pandas中最基本的数据结构,Series的许多属性和方法在DataFrame中也一样适用

 

 

创建DataFrame对象

DataFrame的创建有很多种方式:

  • Serires对象转换为df:上一小节中学习了s.to_frame()

  • 读取文件数据返回df:上一小节中我们使用了pd.read_csv('csv格式数据文件路径')的方式获取了df对象

  • 使用字典、列表、元组创建df

  • 使用字典加列表创建df

    import pandas as pd
    
    dict_data = {
        'id': [1, 2, 3],
        'name': ['张三', '李四', '王五'],
        'age': [18, 20, 22]
    }
    
    # 1、将字典转为DataFrame,使用默认自增索引和默认列名
    	# 字典中的key值是df对象的列名,value值是对应列的数据值
    df1 = pd.DataFrame(data=dict_data)
    
    print(df1)
    print(type(df1))
    
    # 2、将字典转为DataFrame,使用自定义索引和列名
    	# 通过index参数指定索引, columns参数指定列的位置
    df2 = pd.DataFrame(data=dict_data, index=['A', 'B', 'C'], columns=['id', 'age', 'name'])
    print(df2)
    
    # 输出结果如下
       id  name  age
    0   1  张三   18
    1   2  李四   20
    2   3  王五   22
    <class 'pandas.core.frame.DataFrame'>
       id  age  name
    A   1   18  张三
    B   2   20  李四
    C   3   22  王五

    使用列表加元组创建df,并自定义索引

    list_data = [(1, '张三', 18),
                 (2, '李四', 20),
                 (3, '王五', 22)]
    
    
    #  将以上的列表+元组转为DataFrame
    df3 = pd.DataFrame(data=list_data,
                       index=['A', 'B', 'C'],  # 手动指定索引
                       columns=['id', 'name', 'age'])  # 手动指定列名
    print(df3)
    
    # 输出结果如下
       id  name  age
    A   1  张三   18
    B   2  李四   20
    C   3  王五   22

    3.2 DataFrame对象常用属性和方法

    DataFrame对象常用属性和方法与Series对象的几乎相同

import pandas as pd

# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')

print('=============== 常用属性 ===============')
# 查看维度, 返回元组类型 -> (行数, 列数), 元素个数代表维度数
print(df.shape)
# 查看数据值个数, 行数*列数, NaN值也算
print(df.size)
# 查看数据值, 返回numpy的ndarray类型
print(df.values)
# 查看维度数
print(df.ndim)
# 返回列名和列数据类型
print(df.dtypes)
# 查看索引值, 返回索引值对象
print(df.index)
# 查看列名, 返回列名对象
print(df.columns)
print('=============== 常用方法 ===============')
# 查看前5行数据
print(df.head())
# 查看后5行数据
print(df.tail())
# 查看df的基本信息
df.info()
# 查看df对象中所有数值列的描述统计信息
print(df.describe())
# 查看df对象中所有非数值列的描述统计信息
# exclude:不包含指定类型列
print(df.describe(exclude=['int', 'float']))
# 查看df对象中所有列的描述统计信息
# include:包含指定类型列, all代表所有类型
print(df.describe(include='all'))
# 查看df的行数
print(len(df))
# 查看df各列的最小值
print(df.min())
# 查看df各列的非空值个数
print(df.count())
# 查看df数值列的平均值
print(df.mean())

 

3.3 布尔值列表获取DataFrame对象中部分数据

  • 同Series一样,DataFrame也可以使用布尔值Series对象获取数据子集

# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')

# 通过布尔类型的s对象来过滤df对象中的数据
print(df['Age'] > df['Age'].mean())
print(df[df['Age'] > df['Age'].mean()])

# 输出结果如下
0    False
1     True
2     True
3     True
4    False
5    False
6    False
7     True
Name: Age, dtype: bool
                   Name        Born        Died  Age     Occupation
1        William Gosset  1876-06-13  1937-10-16   61   Statistician
2  Florence Nightingale  1820-05-12  1910-08-13   90          Nurse
3           Marie Curie  1867-11-07  1934-07-04   66        Chemist
7          Johann Gauss  1777-04-30  1855-02-23   77  Mathematician
# 获取第1、2、4、8行数据
# 通过布尔类型的列表来过滤df对象中的数据
# 布尔值列表个数要和df的行数相同
bool_list = [True, True, False, True, False, False, False, True]
print(df[bool_list])

# 输出结果如下
                Name        Born        Died  Age     Occupation
0  Rosaline Franklin  1920-07-25  1958-04-16   37        Chemist
1     William Gosset  1876-06-13  1937-10-16   61   Statistician
3        Marie Curie  1867-11-07  1934-07-04   66        Chemist
7       Johann Gauss  1777-04-30  1855-02-23   77  Mathematician

 

DataFrame对象的运算

DataFrame和数值型变量计算时,变量会与DataFrame中的每个元素逐一进行计算,但df中存在非数值类型列时不能进行加减除运算

两个DataFrame之间、以及df和s对象进行计算时,索引值相同的行之间会进行计算;索引值不同的行的计算结果会用NaN值(缺失值)填充。

  • df和数值型变量计算

总结

Pandas中的API太多,千万不要尝试去记忆,你记不住的,要求有印象、能找到、能看懂

  • 理解类知识点

    • dataframe和series对象是什么:

      • 可以认为df是有行有列有索引的二维数据表

      • df和s是Pandas中最核心的数据结构

      • df中每一列或者每一行都是s对象

      • s对象也有索引

      • 每一个s对象都有各自的数据类型,表示构成这个s对象中的值的type;常用的数据类型有

        • Object -- 字符串

        • int -- 整数

        • float -- 小数

  • series和dataframe的API

 # <s/df>表示s对象或df对象
<s/df>.size # 返回数据个数
<s/df>.shape # s返回(行数,),df返回(行数,列数)
<s/df>.dtypes # s返回数据类型,df返回列名和该列数据的类型
<s/df>.values # 返回全部值
<s/df>.index # 查看索引
<s/df>.head() # s返回前5个数据,df返回前5行数据
<s/df>.tail() # s返回后5个数据,df返回后5行数据
df.info() # 返回df的基本信息:索引情况,以及各列的名称、数据数量、数据类型;s对象没有这个函数
<s/df>.describe() # 返回s或df对象中所有数值类型数据的基础统计信息
df.describe(include='all') # 返回df对象中全部列数据的基础统计信息

  • series以及dataframe的运算

    • 当s或df和数值进行运算时,每一个具体的值会分别和数值进行运算,但s或df中的数据存在非数值类型时不能做加减除法运算

    • 两个s之间、两个df之间,以及df和s对象进行计算,会根据索引的值进行对应计算,当两个对象的索引值不能对应时,不匹配的会返回NaN

  • 判断表达式

    • s对象的判断表达式返回由布尔值构成的numpy.ndarray数组

    • 布尔值列表或数组获取s或df对象中部分数据的方法:返回True对应的(行)数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值