参考资料:活用pandas库
1、加载数据集
通常调用read_csv函数来加载CSV数据文件。若是.tsv文件也是用read_csv函数。
# 导入库
import pandas as pd
# 默认情况下,read_csv函数会读取逗号分隔文件
# Gapminder数据使用制表符分隔
# 可以吧sep参数设置为\t,显示指明使用制表符分隔
df=pd.read_csv(r"..\data\gapminder.tsv",sep="\t")
# 调用head()方法,默认显示前5行
print(df.head())
可以使用python内置的type函数来检查read_csv返回的是否是DataFrame。
每个DataFrame对象都有一个shape属性,用来指明DataFrame的行数和列数。shape属性会返回一个元组,其中第一个值是行数,第二个值是列数。
通过DataFrame的columns属性来得到df的列名。
pandas的DataFrame对象和其他语言(比如R)中的DataFrame对象相似,每列的类型必须相同,而每行可以包含混合类型。可以使用DataFrame的dtypes属性或info方法进行查询每列的数据类型。
# 获取每列的dtype
print(df.dtypes)
# 分割线
print("-"*50)
# 获取每列更多的数据信息
print(df.info())
2、查看列、行和单元格
(1)获取指定列的数据子集
# 只获取country列,并将其保存在一个变量中
country_df=df["country"]
print(country_df.head())
# 同时获取多列数据需要将多列的名称作为列表
# 查看country、continent、year列
subset=df[["country","continent","year"]]
print(subset.head())
(2)获取指定行的数据子集
# python是从0开始计数的
# 获取第一行数据
print(df.loc[0])
print(df.head(1))
# 获取第100行数据
print(df.loc[99])
# 获取最后一行的数据
# 通过shape属性的第一个值获取行数
num_of_rows=df.shape[0]
# 行数减去1即可得到最后一个索引值
last_row_index=num_of_rows-1
# 传入最后一行的索引获取最后一行
print(df.loc[last_row_index])
print(df.tail(1))
请注意,head()、tail()和loc是以不同的方式输出结果的。
subset_loc=df.loc[0]
subset_head=df.head(n=1)
# 使用loc获取一行数据时返回Series类型
print(type(subset_loc))
# 使用head获取一行数据时返回DataFrame类型
print(type(subset_head))
loc也可以获取多行,如下:
# 获取第2、101、1001行数据
print(df.loc[[1,100,1000]])
iloc和loc功能相同,但它使用行索引号来获取行。在当前的示例中,iloc和loc的行为完全相同,因为索引标签就是行号。但请注意索引标签不限于行号。
# 使用iloc获取第二行
print(df.iloc[1])
# 使用iloc获取第100行
print(df.iloc[99])
# 使用iloc获取最后一行,请注意:
# 使用illoc使时,可以传入-1来获取最后一行的数据
# 而loc则不能这么操作
print(df.iloc[-1])
# 用iloc获取第1,100,1000行数据
print(df.iloc[[0,99,999]])
(3)混合
loc和iloc属性可用于获取列、行或二者的子集。语法如下:
df.loc[[行],[列]] 或 df.iloc[[行],[列]]
在python切片育种中,如果只用一个冒号:,表示取出所有数据。
# 使用loc获取列子集
# 请注意冒号的位置
# 此处冒号用于选择所有行
subset=df.loc[:,["year","pop"]]
print(subset.head())
# 使用iloc获取列子集
# iloc支持使用整数来获取列
# 此处-1表示选取最后一列
subset=df.iloc[:,[2,4,-1]]
print(subset.head())
可以使用python内置的range函数创建一个值范围,来获取指定范围的列子集
# 获取0-4列的数据集
small_range=list(range(5))
print(small_range)
# 使用range取DataFrame子集
subset=df.iloc[:,small_range]
print(subset.head())
# 获取3-5列的数据集
small_range=list(range(3,6))
print(small_range)
subset=df.iloc[:,small_range]
print(subset.head())
使用切片语法与range函数语法类似。使用range函数时,用逗号把起始值、结束值和步长隔开,而在切片语法中使用冒号来分隔。range函数可用于创建生成器并转换成一个值列表,但切片的冒号语法仅做切片和取子值时才有意义,它本身没有内在意义。
# 使用切片语法获取前三列
subset=df.iloc[:,:3]
print(subset.head())
# 使用切片语法获取第4到6列
subset=df.iloc[:,3:6]
print(subset.head())
# 获取第1、3、5列
subset=df.iloc[:,0:6:2]
# 同range(0,6,2)
print(subset.head())
在loc属性和iloc属性中,要选择特定行或特定列,可以把要选的行放在逗号左边,把要选的列放在逗号右边。但要注意loc和iloc的区别。
# 使用loc
print(df.loc[42,"country"])
# 使用iloc
print(df.iloc[42,0])
当然也可以同时获取多行,多列的数据。在实际工作中,建议尽量传入实际的列名,这样做可以使代码更易读。阅读这样的代码时,无须查看列名向量就能知道所调用的索引。
# 获取第1、100、1000行
# 获取第1,4,6列
print(df.iloc[[0,99,999],[0,3,5]])
print(df.loc[[0,99,999],["country","lifeExp","gdpPercap"]])