在学完series后,我紧接着把DataFrame的创建也过了一遍,今天就开始整理之路了。
DataFrame里的数据是按照行和列来进行排列,现在我们一起来看下如何对DataFrame的数据按照行或者列进行选择、遍历以及修改。获取之前我们要清楚DataFrame中的数据情况,
首先数据的维度是一维还是二维的我们可以使用ndim查看,数据的行数和列数shape,以及行列的索引值index、columns
import pandas as pd df_dict = { 'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'], 'age':['18','20','19','22'], 'weight':['50','55','60','80'] } df = pd.DataFrame(data=df_dict,index=['001','002','003','004']) print(df) # 获取行数和列数 print(df.shape) # 获取行索引 print(df.index.tolist()) # 获取列索引 print(df.columns.tolist()) # 获取数据的维度 print(df.ndim)
name age weight 001 ZhangSan 18 50 002 LiSi 20 55 003 WangWu 19 60 004 ZhaoLiu 22 80 (4, 3) ['001', '002', '003', '004'] ['name', 'age', 'weight'] 2
若数据量过大,则可以用以下两种方式
获取前两条
df.head(2)
获取后两条
df.tail(2)
接下来讲一讲切片
import pandas as pd df_dict = { 'name':['ZhangSan','LiSi','WangWu','ZhaoLiu'], 'age':['18','20','19','22'], 'weight':['50','55','60','80'] } df = pd.DataFrame(data=df_dict,index=['001','002','003','004']) # 通过位置索引切片获取一行 print(df[0:1]) # 通过位置索引切片获取多行 print(df[0:3]) # 获取多行里面的某几列 print(df[1:3][['name','age']]) # 获取DataFrame的列 print(df['name']) # 如果获取多个列 print(df[['name','age']])
name age weight 001 ZhangSan 18 50 name age weight 001 ZhangSan 18 50 002 LiSi 20 55 003 WangWu 19 60 name age 002 LiSi 20 003 WangWu 19 001 ZhangSan 002 LiSi 003 WangWu 004 ZhaoLiu Name: name, dtype: object name age 001 ZhangSan 18 002 LiSi 20 003 WangWu 19 004 ZhaoLiu 22
这和series的切片差不多,类似的用法
df[]不支持直接输入标签索引获取行数据,例如:df[‘001’]
这种方式可以获取一列数据,列如:df[‘name’]
如果想获取多行里面的某几列可写成:df[行][列],例如:df[1:3][[‘name’,‘age’]],将列索引值放到同一个列表中,再将列表放到第二个方括号中.
当然我们也可以使用另外两个比较好用的方法进行获取数据:通过行标签索引筛选loc[],通过行位置索引筛选iloc[]:。
1.df.loc[] 通过标签索引获取行数据,它的语法结构是这样的:df.loc[[行],[列]],方括号中用逗号分隔,左侧是行、右侧是列。千万注意:如果行或者列使用切片的时候,要把方括号去掉,列df.loc[‘001’:‘003’,‘name’:‘weight’]。
2.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[‘001’:‘003’]的结果中包含行索引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)