[TOC]
数据初始化
1、readcsv
1 | df = pd.read_csv('file_path') |
2、
1 | df = pd.DataFrame(columns=['index', 'v2']) |
3、pd 和np转换
首先导入numpy模块、pandas模块、创建一个DataFrame类型数据df
1 | import numpy as np |
语法 | 操作 | 返回结果 |
---|---|---|
df.head(n) |
查看 DataFrame 对象的前n行 | DataFrame |
df.tail(n) |
查看 DataFrame 对象的最后n行 | DataFrame |
df.sample(n) |
查看 n 个样本,随机 | DataFrame |
读取列
以下两种方法都可以代表一列:
1 | df['name'] # 会返回本列的 Series |
注意,当列名为一个合法的 python 变量时可以直接作为属性去使用。
读取部分行列
有时我们需要按条件选择部分列、部分行,一般常用的有:
操作 | 语法 | 返回结果 |
---|---|---|
选择列 | df[col] |
Series |
按索引选择行 | df.loc[label] |
Series |
按数字索引选择行 | df.iloc[loc] |
Series |
使用切片选择行 | df[5:10] |
DataFrame |
用表达式筛选行 | df[bool_vec] |
DataFrame |
以上操作称为 Fancy Indexing(花式索引),它来自 Numpy,是指传递一个索引序列,然后一次性得到多个索引元素。Fancy Indexing 和 slicing 不同,它通常将元素拷贝到新的数据对象中。索引中可以有切片 slice,或者省略 ellipsis、新轴 newaxis、布尔数组或者整数数组索引等,可以看做是一个多维切片。
接下来我们将重点介绍一下这些查询的方法。
数据遍历
1. 使用 .iterrows()
iterrows()
方法返回 DataFrame 的索引标签和相应的行数据。这是一个迭代器,它会产生 (index, Series) 对,其中索引是行索引(如果有),Series 是该行的数据。
1 | import pandas as pd |
2. 使用 .itertuples()
itertuples()
方法返回一个迭代器,用于迭代 DataFrame 行作为命名元组。这种方式比使用 iterrows()
更快一些,因为不需要创建 Series 对象。
1 | # 遍历每一行 |
3. 使用 .apply()
apply()
方法可以应用于整个 DataFrame 或者沿着一个轴应用到每一列或每一行上。这里我们使用 axis=1
来对每一行应用函数。
1 | def process_row(row): |
4. 使用 .loc
或 .iloc
如果你想要更灵活地访问特定行或列的数据,可以使用 .loc
或 .iloc
方法。
1 | # 使用 .loc 按照标签索引访问 |
切片 [行/列]
我们可以像列表那样利用切片功能选择部分行的数据,但是不支持索引一条:
1 | df[:2] # 前两行数据 |
也可以选择列:
1 | df['name'] # 只要一列,Series |
按标签 .loc(行)
df.loc()
的格式为 df.loc[<索引表达式>, <列表达式>],表达式支持以下形式:
单个标签:
1 | # 代表索引,如果是字符需要加引号 |
单个列表标签:
1 | name, value, socre, grade |
1 | df.loc[[0,5,10]] # 指定索引 0,5,10 的行 |
带标签的切片,包括起始和停止start:stop
, 可以其中只有一个,返回包括它们的数据:
1 | df.loc[0:5] # 索引切片, 代表0-5行,包括5 |
关于 loc 的更详细介绍可访问:loc 查询数据行和列。
进行切片操作,索引必须经过排序,意味着索引单调递增或者单调递减,以下代码中其中一个为 True,否则会引发 KeyError
错误。
1 | # 索引单调性 |
通过上边的规则可以先对索引排序再执行词义上的查询,如:
1 | # 姓名开头从 Ad 到 Bo 的 |
列筛选,必须有行元素:
1 | dft.loc[:, ['Q1', 'Q2']] # 所有行,Q1 和 Q2两列 |
按位置 .iloc
df.iloc
与 df.loc
相似,但只能用自然索引(行和列的 0 - n 索引),不能用标签。
1 | df.iloc[:3] |
如果想筛选多个不连续的行列数据(使用 np.r_
),可以使用以下方法:
1 | # 筛选索引0-4&10&5-29每两行取一个&70-74 |
关于 iloc 的更详细介绍可访问:iloc 数字索引位置选择。
取具体值 .at
类似于 loc, 但仅取一个具体的值,结构为 at[<索引>,<列名>]:
1 | # 注:索引是字符需要加引号 |
同样 iat 和 iloc 一样,仅支持数字索引:
1 | df.iat[4, 2] # 65 |
.get 可以做类似字典的操作,如果无值给返回默认值(例中是0):
1 | df.get('name', 0) # 是 name 列 |
表达式筛选
[]
切片里可以使用表达式进行筛选:
1 | df[df['Q1'] == 8] # Q1 等于8 |
df.loc
里的索引部分可以使用表达式进行数据筛选。
1 | df.loc[df['Q1'] == 8] # 等于8 |
逻辑判断和函数:
1 | df.eq() # 等于相等 == |
其他函数:
1 | # isin |
函数筛选
函数生成具体的标签值或者同长度对应布尔索引,作用于筛选:
1 | df[lambda df: df['Q1'] == 8] # Q1为8的 |
函数不仅能应用在行位上,也能应用在列位上。
str查询
模糊查询
1 | data[data.列名.str.contains()] |
df内置方法
where 和 mask
1 | s.where(s > 90) # 不符合条件的为 NaN |
mask 和 where 还可以通过数据筛选返回布尔序列:
1 | # 返回布尔序列,符合条件的行为 True |
query
1 | df.query('Q1 > Q2 > 90') # 直接写类型 sql where 语句 |
filter
使用 filter 可以对行名和列名进行筛选。
1 | df.filter(items=['Q1', 'Q2']) # 选择两列 |
关于 filter 的详细介绍,可以查阅:Pandas filter 筛选标签。
索引选择器 pd.IndexSlice
pd.IndexSlice
的使用方法类似于df.loc[]
切片中的方法,常用在多层索引中,以及需要指定应用范围(subset 参数)的函数中,特别是在链式方法中。
1 | df.loc[pd.IndexSlice[:, ['Q1', 'Q2']]] |
复杂的选择:
1 | # 创建复杂条件选择器 |
按数据类型
可以只选择或者排除指定类型数据:
1 | df.select_dtypes(include=['float64']) # 选择 float64 型数据 |
any 和 all
any 方法如果至少有一个值为 True 是便为 True,all 需要所有值为 True 才为 True。它们可以传入 axis 为 1,会按行检测。
1 | # Q1 Q2 成绩全为 80 分的 |
理解筛选原理
df[<表达式>] 里边的表达式如果单独拿出来,可以看到:
1 | df.Q1.gt(90) |
会有一个由真假值组成的数据,筛选后的结果就是为 True 的内容。
mean() / median() / unique() / value_count()
mean()
median()
unique()
value_count()
map & apply
1 | # Series数据修改,返回当前列的series |
案例实操
获取指定值的索引
有时候我们需要知道指定值所在的位置,即一个值在表中的索引,可以使用以一下方法:
1 | # 指定值的的索引对 |
修改某行某列的值
1 | import pandas as pd |