Pandas之Series和DataFrame

Pandas是一个强大的分析结构化数据的工具集.它的使用基础是Numpy(提供高性能的矩阵运算).Pandas可以用于数据挖掘和数据分析,同时也提供数据清洗功能.不仅如此数据导入导出,数据可视化它都可以完成.

Pandas利器之 Series,是一种类似于一维数组的对象.Series和Python中的列表非常相似,但是它的每个元素的数据类型必须相同.

Pandas利器之 DataFrame,是Pandas中的一个表格型的数据结构.是多维的.可以把DataFrame看作由Series对象组成的字典,其中key是列名,值是Series.

注意:Pandas中只有列 或者 二维表, 没有行的数据结构(即使是行的数据, 也会通过列的方式展示).

一、series

1.1 创建Series对象

1.1.1 概述

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

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

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

格式

Series(列表/元组/字典)

例如

# 方式1: 把 Numpy的 ndarray 转为 Series
# 1. 创建numpy的ndarray对象.
arr = np.array([1, 2, 3, 4, 5])
print(type(arr))  # <class 'numpy.ndarray'>

# 2. 把上述的 ndarray => Series
s1 = pd.Series(arr)
print(f's1的内容: {s1}')
print(f's1的类型: {type(s1)}')  # <class 'pandas.core.series.Series'>

# 演示 元组 => Series对象
s3 = pd.Series((10, 20, 30))
print(f's3的内容: {s3}')
print(f's3的类型: {type(s3)}')  # <class 'pandas.core.series.Series'>

# 演示 字典 => Series对象
s4 = pd.Series({'A': 1, 'B': 2, 'C': 3})
print(f's4的内容: {s4}')
print(f's4的类型: {type(s4)}')  # <class 'pandas.core.series.Series'>

# 创建Series对象的时候, 加入: 索引. 
s5 = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(f's5的内容: {s5}')
print(f's5的类型: {type(s5)}')  # <class 'pandas.core.series.Series'>

1.2 常用属性

格式

loc[]		# 索引列
iloc[]		# 行号
shape		# 维度,(行, 列)
size 		# 元素个数
dtype		# 元素类型
dtypes		# 效果同上
index		# 获得所有的索引列,也就是列名
keys()		# 效果同上
values		# 获取所有的值

例如

# 1. 读取文件数据, 获取DF对象.
df = pd.read_csv('./data/nobe***s.csv', index_col='id')
# 2. 打印数据的前5条数据.
df.head()       # 默认获取前5条数据.

# 2. 从df对象获取第一行数据, 充当Series对象.
# 方式1: 根据 索引列 获取.
first_row = df.loc[941]
print(first_row)
print(type(first_row))  # <class 'pandas.core.series.Series'>

# 方式2: 根据 行号 来获取.
first_row = df.iloc[0]
print(first_row)
print(type(first_row))  # <class 'pandas.core.series.Series'>

# 3. 演示Series的属性
print(first_row.shape)      # (7,),   维度
print(first_row.size)       # 7, 元素个数
print(first_row.dtype)      # Series的元素类型, object => 字符串
print(first_row.dtypes)     # 效果同上.

# 扩展: 演示 int 和 str的 "dtype"属性
print(first_row['year'])        # 从Series对象中, 获取: year列的值. 
print(first_row['year'].dtype)  # 从Series对象中, 获取: year列的值 的 数据类型: int64
# print(first_row['category'].dtype)  # 从Series对象中, 获取: category列的值 的 数据类型. 报错, 因为字符串没有dtype属性.


# index: 获取所有的 索引列(即: 列名)
print(first_row.index)
print(first_row.keys())  # 效果同上, 即: key()函数 效果 和 index属性效果 有一致.

# values: 获取所有的 值
print(first_row.values)

1.3 常用方法

格式

len()	  # 获取长度
head()    # 获取前5条数据
head(n=2) # 获取前2条数据
tail()    # 获取后5条数据
tail(n=3) # 获取后3条数据

keys()    # 获取所有的列名
tolist()  # Series => list列表
to_list() # 效果同上
to_frame()# Series => DataFrame对象.

drop_duplicates() # 去重, 返回 => Series对象
unique()          # 去重, 返回 => list列表

sort_values()                 # 根据值排序, 默认: 升序, ascending = True
sort_values(ascending=False)  # 根据值排序, ascending=False => 降序
sort_index(ascending=False)   # 根据索引排序 

mean()		# 平均值
max()		# 最大值
min()		# 最小值
sum()		# 求和
count()		# 统计该列的 非空值的个数
std()		# 标准差

value_counts()	# 类似于SQL语句: select 性别, count(id) from 表名 group by 性别;
describe()		# 查看列的详细信息

例如

# 1. 创建Series对象.
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)

# 2. 演示Series对象的常用方法.
print(len(s1))      # 获取长度, 6
print(s1.head())    # 获取前5条数据
print(s1.head(n=2)) # 获取前2条数据
'''
6
A    1
B    2
C    3
D    4
E    2
dtype: int64
A    1
B    2
dtype: int64
'''

print(s1.tail())    # 获取后5条数据
print(s1.tail(n=3)) # 获取后3条数据
'''
B    2
C    3
D    4
E    2
F    3
dtype: int64
D    4
E    2
F    3
dtype: int64
'''

print(s1.keys())    # 获取所有的列名
'''
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
'''

print(s1.tolist())  # Series => list列表
print(s1.to_list()) # 效果同上
print(s1.to_frame())# Series => DataFrame对象.
'''
[1, 2, 3, 4, 2, 3]
[1, 2, 3, 4, 2, 3]
   0
A  1
B  2
C  3
D  4
E  2
F  3
'''

print(s1.drop_duplicates()) # 去重, 返回 => Series对象
print(s1.unique())          # 去重, 返回 => list列表
'''
A    1
B    2
C    3
D    4
dtype: int64
[1 2 3 4]
'''

print(s1.sort_values())                 # 根据值排序, 默认: 升序, ascending = True
print(s1.sort_values(ascending=False))  # 根据值排序, ascending=False => 降序
'''
A    1
B    2
E    2
C    3
F    3
D    4
dtype: int64
D    4
C    3
F    3
B    2
E    2
A    1
dtype: int64
'''

print(s1.sort_index(ascending=False))   # 根据索引排序
'''
F    3
E    2
D    4
C    3
B    2
A    1
dtype: int64
'''

# 平均值, 最大值, 最小值, 求和, 标准差...
print(s1.mean())        # 2.5 平均值
print(s1.max())
print(s1.min())
print(s1.sum())
print(s1.count())       # 统计该列的 非空值的个数.
print(s1.std())         # 标准差
'''
2.5
4
1
15
6
1.0488088481701516
'''

# 统计每个元素的个数
print(s1.value_counts())     # 类似于SQL语句: select 性别, count(id) from 表名 group by 性别;
'''
2    2
3    2
1    1
4    1
Name: count, dtype: int64
'''

# 查看Series列的详细信息.
print(s1.describe())
'''
count    6.000000
mean     2.500000
std      1.048809
min      1.000000
25%      2.000000
50%      2.500000
75%      3.000000
max      4.000000
dtype: float64
'''

1.4 布尔索引

格式

对象[条件]

例如

# 细节: True => 要,  False => 不要.
# 1. 读取数据, 获取df对象
df = pd.read_csv('data/scien***.csv')
df

# 2. 查看每列的详细信息
df.describe()   # 统计信息
df.info()       # 详细信息

# 3. 从df对象中 => 获取 Series 对象
series_age = df.Age
series_age

# 4. 演示Series对象的 布尔索引
bool_list = [True, False, False, True, True, False, False, True]
print(series_age[bool_list])

# 5. 筛选年龄大于平均年龄的科学家.
# 5.1 获取平均年龄
avg_mean = series_age.mean()
print(avg_mean)     # 59.125

# 5.2 看看当前年龄 是否大于 平均年龄
bool_list = series_age > avg_mean
print(bool_list)        # [False, True, True, True, False, False, False, True]

# 5.3 获取 年龄大于平均年龄的科学家
print(series_age[series_age > avg_mean])

# 6. 上述代码优化版, 一行搞定.
# 补充: df['列名'] 和 df.列名  都可以从df中获取到指定的 列.
# print(df.Age[df.Age > df.Age.mean()])
print(df['Age'][df['Age'] > df['Age'].mean()])

1.5 运算

格式

+*

例如

# 场景1: Series对象 和 数值运算, 则数值会和 Series对象的每个值进行具体的运算. 
series_age + 100
series_age * 2

# 场景2: Series对象 和 Series对象运算, 会优先参考 索引列运算, 即: 索引值相同的进行计算, 不同的用NAN(空值)填充.
series_age + series_age

series_age.sort_index(ascending=False) + series_age

series_age + pd.Series([1, 2, 3])
series_age + pd.Series([1, 2, 3], index=['a', 'b', 'c'])

二、DataFrame

2.1创建DataFrame对象

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

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

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

2.1.2 index和columns属性

格式

pandas.DataFrame(data=容器名称, columns=列名, index=行名(索引))

例如

# 1. 定义字典, 记录: 数据.
my_dict = {
    'id': [1, 2, 3],
    'name': ['悟空', '八戒', '老沙'],
    'age': [500, 400, 200]
}

# 2. 把上述的字段 => DataFrame对象
# columns: 指定列的顺序.
# index: 指定 索引列的值.
df2 = pd.DataFrame(data=my_dict, columns=['name', 'id', 'age'], index=['X', 'Y', 'Z'])

# 3. 打印结果.
print(df2)
print(type(df2))    # <class 'pandas.core.frame.DataFrame'>
'''
  name  id  age
X   悟空   1   500
Y   八戒   2   400
Z   老沙   3   200
<class 'pandas.core.frame.DataFrame'>
'''
2.1.3 实操

格式

常见的有  字典格式  和  列表套元组

例如

# 1. 定义字典, 记录: 数据.
my_dict = {
    'id': [1, 2, 3],
    'name': ['悟空', '八戒', '老沙'],
    'age': [500, 400, 200]
}

# 2. 把上述的字段 => DataFrame对象
df1 = pd.DataFrame(my_dict)

# 3. 打印结果.
print(df1)
print(type(df1))    # <class 'pandas.core.frame.DataFrame'>
'''
   id name  age
0   1   悟空   500
1   2   八戒   400
2   3   老沙   200
<class 'pandas.core.frame.DataFrame'>
'''


# 1. 定义列表, 记录: 数据.
my_list = [
    (1, '悟空', 500),
    (2, '八戒', 400),
    (3, '老沙', 200)
]

# 2. 把上述的字段 => DataFrame对象
# columns: 指定列的顺序.
# index: 指定 索引列的值.
df3 = pd.DataFrame(data=my_list, columns=['id', 'name', 'age'], index=['X', 'Y', 'Z'])

# 3. 打印结果.
print(df3)
print(type(df3))    # <class 'pandas.core.frame.DataFrame'>
'''
   id name  age
X   1   悟空   500
Y   2   八戒   400
Z   3   老沙   200
<class 'pandas.core.frame.DataFrame'>
'''

2.2 常用属性

格式

df对象.shape		# 数组的维度
df对象.size		# 元素个数	
df对象.values		# df元素对象->ndarray形式
df对象.dtypes		# 各列元素的类型
df对象.ndim		# 数组的秩,也就是数组的维度数量或者轴的数量
df对象.index		# 获得所有的索引列的值
df对象.columns	# 获得所有的列名

例如

# 1. 读取文件, 获取df对象.
df = pd.read_csv('data/scien***.csv')

# 2. 演示df对象常用属性
print(df.shape)  # 维度: (8, 5)
print(df.size)  # 元素个数: 行数 * 列数, 40
print(df.values)  # DF对象 => ndarray形式
print(type(df.values))  # <class 'numpy.ndarray'>
print(df.dtypes)  # (各列)的元素类型
print(df.ndim)  # 维度, 2
print(df.index)  # 获取所有的 索引列(的值)
print(df.columns)  # 获取所有的列名

2.3 常用方法

格式

len(df对象)			# 行数
对象.head()			# 默认前5行
对象.head(n=2)		# 前2行
对象.tail()			# 默认后5行
对象.tail(n=2)		# 后2行
对象.info() 			# 查看各列的基本信息
对象.describe()		# 查看各列的统计信息(默认只显示数值列),包括: 平均值, 方差, 最大值, 最小值等
对象.describe(include='all')	# 查看各列的统计信息, 所有列
对象.describe(exclude=['int', 'float'])	# 查看各列的统计信息, 不包含int, float类型的列
对象.count()			# 查看各列非空值的总数
对象.max()			# 查看各列的最大值
对象.min()  			# 查看各列的最小值
对象.数值列名.mean()   # 该数值列的平均值

例如

# 演示df对象的常用方法
print(len(df))  # 8, 行数
print(df.head())  # 默认是前5行
print(df.head(n=2))  # 前2行
print(df.tail())  # 默认是后5行
print(df.tail(n=2))  # 后2行

print(df.info())  # 查看各列的基本信息, 包括: 列名, 列元素个数, 列元素类型
print(df.describe())  # 查看各列的统计信息(默认只显示 数值列相关), 包括: 平均值, 方差, 最大值, 最小值等
print(df.describe(include='all'))  # 查看各列的统计信息, 所有列. 
print(df.describe(exclude=['int', 'float']))  # # 查看各列的统计信息, 不包含int, float类型的列

print(df.count())  # 查看各列的非空值总数
print(df.max())  # 查看各列的最大值
print(df.min())  # 查看各列的最小值
# print(df.mean())     # 查看数值列的平均值, 针对于旧版本Anaconda(例如: 2020版)有效. 新版本不支持.
print(df.Age.mean())

2.4 索引

格式

# 布尔索引
df[df.数值列名 > df.数值列名.mean()]  # df对象的布尔值操作.
df.列名[df.列名 > df.列名.mean()]  # Series对象的布尔值操作.

例如

# 需求: 过滤出df对象中, Age列大于平均年龄的数据行
df[df.Age > df.Age.mean()]  # df对象的布尔值操作.
df.Age[df.Age > df.Age.mean()]  # Series对象的布尔值操作.

2.5 运算

格式

+*

例如

# 1. 和数值运算的时候, 数值会和df对象的每个值进行计算.
# 2. 和新的df计算的时候, 会优先参考索引, 对应索引进行计算, 不匹配就返回NAN.

# 场景1: df 和 数值计算.
df * 2

# 场景2: df 和 df计算
df + df

df + df[:4]  # 类似于Python的切片, 即: 获取前4行, 索引为: 0 ~ 4 包左不包右

以上就是和大家分享的Pandas中的两个非常重要的对象Series和DataFrame,往期文章有关面向对象三大特征与数据结构等相关介绍.喜欢的小伙伴可以点赞,关注不迷路,持续更新中…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值