原文链接:https://zhuanlan.zhihu.com/p/84885215
创建2个DataFrame,一个没有行列命名,一个有行列名。来进行常规切片、loc/iloc索引、布尔索引的对比试验。
1.使用Numpy和pandas创建两个DataFrame
之前别忘了导入Numpy和pandas库。
df1 = pd.DataFrame(np.random.randn(5, 5))
#创建一个DataFrame,但不给行和列命名
df2 = pd.DataFrame(np.arange(20).reshape(4, 5), index=list('ABCD'), columns=list('OPQRS'))
#创建一个DataFrame并给行和列命名
打印出来看下效果:
df1:行和列没有命名
df2:行和列有命名
2.使用[]和数字
df1[2]
df1[2]
df2[2]
df2[2]
可以看到df1[2]获取的是第3列的数据,df2[2]却报错了。说明[]+数字获取的是列值,但遇到有列名的情况就会报错。
3.使用[]和列表
df1[[0, 2]]
df1[[0, 2]]
df2[[0, 2]]
df2[[0, 2]]
df1[[0, 2]]获取的是第1和第3列的数据,df2[[0, 2]]报错。说明[]+列表是通过列名获取多列值。
3.使用[]和:
df1[1:4]
df1[1:4]
df2[1:4]
df2[1:4]
df1和df2都可以获取。而且获取的数据都是第2,3,4行的数据。说明[]+:是通过列位置获取数据。
4.使用loc
#df.loc 通过标签索引行或列数据
df1.loc[[0, 1], :]
df1.loc[[0, 1], :]
df2.loc[['A', 'C'], :]
df2.loc[['A', 'C'], :]
loc的[]包含的是行或者列的标签名,通过:隔开,可选择多行多列。
loc只针对已经命名行列的DataFrame有效,通过位置切片需要用到iloc。
5.使用iloc
#df.iloc通过位置获取行数据 iloc --> index location
df1.iloc[[0, 1], [1, 2]]
df1.iloc[[0, 1], [1, 2]]
df2.iloc[[0, 1], [1, 2]]
df2.iloc[[0, 1], [1, 2]]
iloc通过位置来获取数据,通过:隔开,可选择多行多列。
5.使用布尔索引
从df1中获取介于-0.9和0.9之间的数
df1[df1.abs() < 0.9]
df1[df1.abs() < 0.9]
获取df2中的奇数
df2[df2 % 2 == 1]
df2[df2 % 2 == 1]