pandas学习之df.loc

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 included
  • A 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)

解释:

  1. 需要传入行列或者布尔值的数组:.loc[]不仅允许传入基于标签的数组,还可以是布尔值数组
  2. 允许的输入类型为:
  • 单个标签,比如‘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学习打卡

加油!!!学习虽然不一定会变强,但一定会便变秃

你可能感兴趣的:(pandas)