Series 常用属性和方法
- 表格数据中的每一行或者每一列的数据结构都是Series, 它可以看成一维的表格数据, 它可以属于DataFrame的一部分也可以作为独立的数据结构存在
- 获取数据的值, 使用
values
方法 - 获取索引的值, 使用
index
方法 - 获取每对索引的值, 使用
items
方法
- 获取数据的值, 使用
values、index、items返回的对象分别是List、Index、Zip类型的数据,为了方便我们使用和观察数据,可以使用series.index.tolist()和list(series.items())方法转化成List类型
from pandas import Series
emp = ['01', '02', '03', '04', '05', '06']
name = ['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞']
# 构建数据
series = Series(data=name, index=emp)
# 获取数据的值, 使用 values方法
print("数据的值: ",series.values)
# 获取索引的值, 使用 index 方法
print("索引的值原始值: ", series.index)
print("索引的值转换后: ", list(series.index))
# 获取每对索引的值, 使用 items 方法
print("每对索引和值原始值: ", series.items)
print("每对索引和值转换后: ", list(series.items()))
数据的值: ['小乔' '孙策' '刘备' '赵云' '哪吒' '张飞']
索引的值原始值: Index(['01', '02', '03', '04', '05', '06'], dtype='object')
索引的值转换后: ['01', '02', '03', '04', '05', '06']
每对索引和值原始值: <bound method Series.iteritems of 01 小乔
02 孙策
03 刘备
04 赵云
05 哪吒
06 张飞
dtype: object>
每对索引和值转换后: [('01', '小乔'), ('02', '孙策'), ('03', '刘备'), ('04', '赵云'), ('05', '哪吒'), ('06', '张飞')]
- Series 就像将索引值暴露在外面的list, 在获取数据的时候可以通过索引值来进行单个数据的访问, 也支持切片选择多个数据
- 获取数据格式—
对象名[]
- 获取多个不连续数据时是双层括号—
对象名[[]]
- 使用切片时使用的是:
对象名['下标':'下标']
- 获取数据格式—
from pandas import Series
emp = ['01', '02', '03', '04', '05', '06']
name = ['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞']
# 构建数据
series = Series(data=name, index=emp)
# 使用索引值获取单个数据
print('单个数据: ', series['01'])
# 使用索引值获取多个不连续的数据
print('索引下标: ',series[['02','04']])
# 使用切片获取连续的数据, 这个01:02, 是使用索引为下标
# 如果下标为['a','b','c','d','e','f'],那么此时的切片操作应为series['a':'d']
print('索引切片: ',series['01':'04'])
单个数据: 小乔
索引下标: 02 孙策
04 赵云
dtype: object
索引切片: 01 小乔
02 孙策
03 刘备
04 赵云
dtype: object
- 这样使用也可以,自定义的index值被叫做索引下标,没有设置index值时会有一个默认的值叫做位置下标,这时和操作列表是一样的
from pandas import Series
emp = ['01', '02', '03', '04', '05', '06']
name = ['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞']
# 构建数据
series = Series(data=name, index=emp)
# 获取单个数据
print(series[0])
# 获取多个不连续的数据
print('位置下标',series[[1,3]])
# 使用切片获取连续的数据
print('位置切片',series[0:3])
小乔
位置下标 02 孙策
04 赵云
dtype: object
位置切片 01 小乔
02 孙策
03 刘备
dtype: object
通过遍历也可以获取数据
- 利用循环来遍历Series。我们可以直接遍历Series的值
# 遍历并拿到data数据
for value in series:
print(value)
- 通过keys(),遍历Series的索引
# 遍历并拿到index数据
for value in series.keys():
print(value)
- 通过items(),遍历Series的每对索引和数据
# 遍历并拿到每对索引和数据
for value in series.items():
print(value)
代码示例
from pandas import Series
emp = ['01', '02', '03', '04', '05', '06']
name = ['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞']
# 构建数据
series = Series(data=name, index=emp)
# 遍历并拿到每对索引和数据
for value in series.items():
print(value)
('01', '小乔')
('02', '孙策')
('03', '刘备')
('04', '赵云')
('05', '哪吒')
('06', '张飞')
DataFrame数据的获取和遍历
数据的维度是一维还是二维的我们可以使用ndim查看,数据的行数和列数shape,以及行列的索引值index、columns
import pandas as pd
df_dict = {
'name':['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞'],
'age':['19','20','19','22', '21','23'],
'weight':['50','55','60','80', '60','80']
}
df = pd.DataFrame(data=df_dict,index=['01', '02', '03', '04', '05', '06'])
print(df)
# 获取行数和列数
print("行数和列数: ",df.shape)
# 获取行索引
print('行索引: ',df.index.tolist())
# 获取列索引
print('列索引: ',df.columns.tolist())
# 获取数据的维度
print("维度: ", df.ndim)
print('*'*50)
'''如果数据量太大直接打印df会比较耗时, 所以可以使用head()获取前几行、使用tail()获取后几行, 这两个方法都有默认值, 默认值为5'''
# 获取前两条
# df.head(2)
# 获取后两条
df.tail(2)
name age weight
01 小乔 19 50
02 孙策 20 55
03 刘备 19 60
04 赵云 22 80
05 哪吒 21 60
06 张飞 23 80
行数和列数: (6, 3)
行索引: ['01', '02', '03', '04', '05', '06']
列索引: ['name', 'age', 'weight']
维度: 2
**************************************************
name | age | weight | |
---|---|---|---|
05 | 哪吒 | 21 | 60 |
06 | 张飞 | 23 | 80 |
获取行数据
import pandas as pd
df_dict = {
'name':['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞'],
'age':['19','20','19','22', '21','23'],
'weight':['50','55','60','80', '60','80']
}
df = pd.DataFrame(data=df_dict,index=['01', '02', '03', '04', '05', '06'])
# 通过位置索引切片获取一行
print(df[0:1])
print('*'*50)
# 通过位置索引切片获取多行
print(df[1:3])
print('*'*50)
# 获取多行里面的某几列
print(df[1:3][['name','age']])
print('*'*50)
# 获取DataFrame的列
print(df['name'])
print('*'*50)
# 如果获取多个列
print(df[['name','age']])
"""
df[]不支持直接输入标签索引获取行数据,例如:df['001']
这种方式可以获取一列数据,列如:df['name']
如果想获取多行里面的某几列可写成:df[行][列],例如:df[1:3][['name','age']],将列索引值放到同一个列表中,再将列表放到第二个方括号中
"""
name age weight
01 小乔 19 50
**************************************************
name age weight
02 孙策 20 55
03 刘备 19 60
**************************************************
name age
02 孙策 20
03 刘备 19
**************************************************
01 小乔
02 孙策
03 刘备
04 赵云
05 哪吒
06 张飞
Name: name, dtype: object
**************************************************
name age
01 小乔 19
02 孙策 20
03 刘备 19
04 赵云 22
05 哪吒 21
06 张飞 23
loc()
通过行标签索引筛选loc[],通过行位置索引筛选iloc[]
df.loc[] 通过标签索引获取行数据,它的语法结构是这样的:df.loc[[行],[列]],方括号中用逗号分隔,左侧是行、右侧是列。千万注意:如果行或者列使用切片的时候,要把方括号去掉,列df.loc[‘001’:‘003’,‘name’:‘weight’]
import pandas as pd
df_dict = {
'name':['小乔', '孙策', '刘备', '赵云', '哪吒', '张飞'],
'age':['19','20','19','22', '21','23'],
'weight':['50','55','60','80', '60','80']
}
df = pd.DataFrame(data=df_dict,index=['01', '02', '03', '04', '05', '06'])
# 获取某一行某一列的数据
print(df.loc['01','name'])
# 某一行多列的数据
print(df.loc['01',['name','weight']])
# 一行所有列
print(df.loc['01',:])
# 选择间隔的多行多列
print(df.loc[['01','03'],['name','weight']])
# 选择连续的多行和间隔的多列
print(df.loc['01':'03','name':'weight'])
小乔
name 小乔
weight 50
Name: 01, dtype: object
name 小乔
age 19
weight 50
Name: 01, dtype: object
name weight
01 小乔 50
03 刘备 60
name age weight
01 小乔 19 50
02 孙策 20 55
03 刘备 19 60
iloc()
df.iloc[] 通过位置索引获取行数据,他的操作和loc[]操作是一样的,只要将标签索引改成位置索引就好了
# 取一行
print(df.iloc[1])
# 取连续多行
print(df.iloc[0:2])
# 取间断的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 某一个值
print(df.iloc[1,0])
loc和iloc的切片操作在是否包含切片终点的数据有差异。loc[‘01’:‘03’]的结果中包含行索引003对应的行。iloc[0:2] 结果中不包含序号为2的数据,切片终点对应的数据不在筛选结果中
iterrows() 按行遍历
按行
遍历,将DataFrame的每一行转化为(index, Series)对。index为行索引值,Series为该行对应的数据
for index,row_data in df.iterrows():
print(index,row_data)
iteritems() 按列遍历
按列
遍历,将DataFrame的每一列转化为(column, Series)对。column为列索引的值,Series为该列对应的数据
for col,col_data in df.iteritems():
print(col)