一、对Pandas库认识
pandas(panel data & data analysis),是基于 numpy(提供高性能的矩阵运算)专门用于数据分析的工具,是一个强大的分析结构化数据(表格数据)的工具集,能够用于数 据挖掘和数据分析,同时也提供数据清洗功能
1、DataFrame
name | age | group | |
---|---|---|---|
stu0 | 张某 | 19 | 1 |
stu1 | 王某 | 20 | 1 |
stu2 | 李某 | 19 | 2 |
stu3 | 赵某 | 18 | 2 |
DataFrame 是 Pandas 中的一个表格型的数据结构,包含有一组有序的列,每列可以是 不同的值类型(数值、字符串、布尔型等),观察表格可以发现:表格有三部分组成,表头(列 索引)、行名称(行索引)、数据元素部分,numpy 如何表示表结构的数据,以及和 Dataframe 的区别,numpy 将数据部分、表头(列索引)、行索引单独存放为一个数组
创建 DataFrame 的三种形式
方式 1:逐个传入行索引、列索引和 数据元素
# 导包
import pandas as pd
import numpy as np
# dataframe结构 具有行索引、列索引、数据元素 ---二维数据
# 可以使用pd.DataFrame来创建df数据
# 1、可以将列表嵌套转化为df
df = pd.DataFrame(
data=[['zs', 17, 182.5],
['ls', 18, 190.5],
['ww', 16, 173.0]],
index=['stu_0', 'stu_1', 'stu_2'],
columns=['name', 'age', 'hight']
)
print('df:\n', df)
print('df类型:\n', type(df)) # <class 'pandas.core.frame.DataFrame'>
方式二:借助字典
# 导包
import pandas as pd
import numpy as np
# 2、可以使用大字典来创建df
df = pd.DataFrame(
data={
'name': ['zs', 'ls', 'ww'],
'age': [17, 18, 16],
'hight': [173.0, 185.5, 190.0]
},
index=['stu0', 'stu1', 'stu2']
)
print('df:\n', df)
print('df:\n', type(df)) # <class 'pandas.core.frame.DataFrame'>
方式三:也可以将二维数组数据转化为DataFrame
# 导包
import pandas as pd
import numpy as np
# 3、也可以将二维数组转化为df
# # 先加载一个二维数组
fp = np.load('./lol_data.npz')
# 遍历获取key
# for k in fp:
# print(k)
# 获取保存的数组
columns = fp['columns']
data = fp['data']
print('columns:\n', columns)
print('data:\n', data)
# 剔除掉重复的数据
data = np.unique(data, axis=0)
# 先构建一个index
index = ['index_' + str(i) for i in range(data.shape[0])]
print('index:\n', index)
# 转化为df
df = pd.DataFrame(
data=data,
columns=columns,
index=index
)
print('df:\n', df)
2、Series
它是一种类似于一维数组的对象,是由一组数据(各种 NumPy 数据类型)以及一组与之相 关的数据标签(即索引)组成,仅由一组数据也可产生简单的 Series 对象,Series对象没有列索引
stu0 | 张某 |
stu1 | 王某 |
stu2 | 李某 |
stu3 | 赵某 |
**创建 Series:**可以由简单列表、一维数组转化而来
在 series 对象中,索引与元素之间存在一种映射关系,元素在 series 对象中的有序存 储是通过索引实现的,当传入字典创建 series 对象,可以通过指定索引的方式对 series 对象中的元素进行排序和过滤
# 导包
import pandas as pd
import numpy as np
# 2、通过一维数组、简单列表来转化生产
se = pd.Series(data=['zs', 'ls', 'ww'],index=['stu0', 'stu1', 'stu2'])
se = pd.Series(data=np.array(['zs', 'ls', 'ww']),
index=['stu0', 'stu1', 'stu2'])
print('se:\n', se)
print('se:\n', type(se))
# 3、也可以通过小字典来生成
se = pd.Series(data={
'zs': 79, 'ls': 90, 'ww': 95},
index=['zs', 'ls', 'ww','zl'])
print('se:\n', se)
print('se:\n', type(se))
Series 和 DataFrame 的关系
获取 dataframe 中的一列数据,得到的数据类型为 Series,DataFrame 可以被看做是由 Series 组成的字典
# Series ---
# 只有行索引、数据元素 ---没有列索引 -----只能是1维的
# 而且这个一维 指的是行维度
# # 1、获取姓名这一列
se = df['姓名']
print('se:\n', se)
print('se:\n', type(se)) # <class 'pandas.core.series.Series'>
二、DataFrame 属性及 Series 属性
函数 | 返回值 | 备注 |
---|---|---|
values | 元素 | 表的数据部分 |
index | 索引 | 行索引/行名称 |
columns | 列名 | 列名称/表头 |
dtypes | 元素类型 | 表内元素类型 |
size | 元素个数 | 表内元素个数 |
ndim | 维度数 | values |
shape | 数据形状(行列数目) | 表的数据部分的形状 |
以一个学生信息表的 DataFrame 为例,来研究 DataFrame 属性
DataFrame 属性
代码实现:
import pandas as pd
# 创建一个df
df = pd.DataFrame(
data=[['zs', 17, 178.5],
['ls', 18, 173],
['ww', 19, 178.5]],
index=['stu0', 'stu1', 'stu2'],
columns=['name', 'age', 'hight']
)
# 获取DataFrame属性
print('df:\n', df)
print('df的元素个数:\n', df.size) # --->只计算真实元素,不计算行、列索引
print('df的形状:\n', df.shape)
print('df的维度:\n', df.ndim)
print('df的行索引:\n', df.index) # 行索引名称
print('df的列索引:\n', df.columns) # 列索引名称
print('df的数据元素:\n', df.values)
print('df的数据元素:\n', type(df.values)) # <class 'numpy.ndarray'>
print('df的元素类型:\n', df.dtypes) # 返回的是df中每一列的数据类型
# print('df的元素类型:\n', df.dtype) # 错误的。因为df可以存储不同的数据类型
# print('df的每个元素的占位大小\n', df.itemsize) # 错误的,因为df可以存储不同的数据类型
Series 属性
其实 Series 和 DataFrame 的属性相差不大,与 DataFrame 相比,Series 没有 columns 属性,由于只有一列,且属性一致,因此存在 itemsize 属性
代码实现:
import pandas as pd
# 创建一个df
df = pd.DataFrame(
data=[['zs', 17, 178.5],
['ls', 18, 173],
['ww', 19