pandas学习之df.loc
在数据处理中,经常需要从数据集中提取出部分数据,这种情况下,可以选择df.loc or df.iloc这两种方法。这种方法和df[[列名列表]]类似,但效率上会高于df和列名列表的组合方式。 可以做一个简单的比较:
df.shape#df数据集的概况
(51290, 24)
# %timeit 用于测试一段程序运行效率
%timeit df[['Order_Date','Customer_ID','Market']]#df加列名的提取方式
2.85 ms ± 109 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit df.loc[:,['Order_Date','Customer_ID','Market']]#df.loc的方式
2.6 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
#数据集越大,差距越明显
df.loc篇:
官方文档:
Access a group of rows and columns by label(s) or a boolean array. .loc[] is primarily label based, but may also be used with a boolean array. Allowed inputs are:
A single label, e.g. 5 or ‘a’, (note that 5 is interpreted as a label of the index, and never as an integer position along the index).A list or array of labels, e.g. [‘a’, ‘b’, ‘c’].A slice object with labels, e.g. ‘a’:‘f’. Warning Note that contrary to usual python slices, both the start and the stop are includedA boolean array of the same length as the axis being sliced, e.g. [True, False, True].A callable function with one argument (the calling Series or DataFrame) and that returns valid output for indexing (one of the above)
解释:
需要传入行列或者布尔值的数组:.loc[]不仅允许传入基于标签的数组,还可以是布尔值数组允许的输入类型为:
单个标签,比如‘5’,‘a’。需要注意的是5是行索引上的整数型标签,而不是索引上的第5行,比如有3把椅子,坐着3个人,名字分别是一二三,第3把椅子坐着的是三。3代表这个人处于位置,无论谁坐在这,这里都是第3把椅子;三是这个人名字,无论他在什么位置,他的名字都是三。而.loc[]就是基于标签(名字)来提取的一个标签的列表[‘a’,‘s’]一个标签的切片,如‘a’:‘f’ 注意: .loc[]的切片和python中的不同,这里的切片两端都包括,即左闭右闭区间,而python中是左闭右开区间一个布尔值数组,需要和被切片的轴长度一致一个函数
实验:
import pandas as pd
import numpy as np
df = pd.DataFrame({'name':['张三','李四','王二','麻子','杜甫'],'mark':[120,111,135,150,151],'gender':['male','female','female','male',np.nan]})
df
#为方便演示,构造一个简单的dataframe
name mark gender
0 张三 120 male
1 李四 111 female
2 王二 135 female
3 麻子 150 male
4 杜甫 151 NaN
#单个标签
df.loc[:,'name']#前面的冒号相当于一个切片,即选取所有行,如果直接df.loc['name']会报错
0 张三 #所以可以理解为df.loc[对行的操作,对列的操作],对列可以省略,行不可以
1 李四
2 王二
3 麻子
4 杜甫
Name: name, dtype: object
df.loc[0]
name 张三
mark 120
gender male
Name: 0, dtype: object
#标签列表,注意要使用 [[]] 的形式
df.loc[[0,2],'name']
0 张三
2 王二
Name: name, dtype: object
#切片操作,两端都可以取到
df.loc[0:2,'name'] #注意,这里的0:2是标签,不是位置序列!!!
0 张三
1 李四
2 王二
Name: name, dtype: object
df.loc[1,'name':'gender']# 这样可能更直观,这是个切片是标签
name 李四
mark 111
gender female
Name: 1, dtype: object
#可以传入一个布尔值列表
df.loc[:,[False,True,False]]#注意列表长度必须和对应得轴长度一致,否则报错
mark
0 120
1 111
2 135
3 150
4 151
#可以输入条件,筛选出需要的数据
df.loc[df['mark']>=135]
name mark gender
2 王二 135 female
3 麻子 150 male
4 杜甫 151 NaN
#也可以是函数
df.loc[lambda df: df['mark'] >= 150]
name mark gender
3 麻子 150 male
4 杜甫 151 NaN
#也可以直接对结果赋值
df.loc[4,'gender'] = 'female'
df
name mark gender
0 张三 120 male
1 李四 111 female
2 王二 135 female
3 麻子 150 male
4 杜甫 151 female
6.18学习打卡
加油!!!学习虽然不一定会变强,但一定会便变秃
|