位置计算 & 数据选择

深入浅出Pandas读书笔记

4.4 位置计算

4.4.1 位置计算diff()

原数据在同位置上对移动后的数据相减, 可以传入一个数字来规定移动多少位, 负数代表移动方向相反

s = pd.Series([9, 4, 6, 7, 9])
s.diff() # 后面与前面的差值
'''
0    NaN
1   -5.0
2    2.0
3    1.0
4    2.0
dtype: float64
'''
s.diff(-2) # 前面与后面2位的差值
'''
0    3.0
1   -3.0
2   -3.0
3    NaN
4    NaN
dtype: float64
'''
# 对于DataFrame, 可以传入axis=1进行左右移动
df.diff(1, axis=1)

4.4.2 位置移动shfit()

位移, 不做计算, 支持上下左右移动, 移动后目标位置的类型无法接收的为NaN

df.shift() # 下移一行, 第一行为NaN
df.shift(3) # 移3行
df.shift(-1) # 上移1行, 最后一行为NaN
df.shift(axis=1) # 向右移动1行
# 实现df.diff() 
df - df.shift()

4.4.3 位置序号rank()

rank()可以生成数据的排序值替换原来的数据值, 他支持对所有类型数据进行排序, 如英文会按字母顺序.

df.head().rank()
'''
name	team	Q1	Q2	Q3	Q4
0	4.0	5.0	4.0	1.0	2.0	2.0
1	2.0	2.5	1.0	2.0	3.0	1.0
2	1.0	1.0	2.0	4.0	1.0	4.0
3	3.0	2.5	5.0	5.0	5.0	3.0
4	5.0	4.0	3.0	3.0	4.0	5.0
'''
# 横向排名
df.select_dtypes('number').head().rank(axis=1) # 由于原DataFrame有文本列, 不筛选出number列的话, 会有warning
'''
	Q1	Q2	Q3	Q4
0	4.0	1.0	2.0	3.0
1	1.0	2.5	2.5	4.0
2	2.0	3.0	1.0	4.0
3	3.0	4.0	1.0	2.0
4	3.0	1.0	2.0	4.0
'''

4.5 数据选择

操作语法
选择列df[col], df[[col1, col2]]
按索引选择行df.loc[label]
按数字索引选择行df.iloc[loc]
使用切片选择行df[5:10]
用表达式筛选行df[bool_vec]

4.5.1 选择列

df[col], df.col(这里的col需要复合python变量的命名方式, 不能是数字开头如1Q, 或中间有空格如my name)

4.5.2 切片[]

df[:2] # 前两行数据
df[4:10] # 4-9行
df[:] # 全部
df[:10:2] # 0-9行, 步长为2
df[::-1] # 所有行反过来
df[2] # 这是一种选择列的语法, 返回Series, 如果没有一列叫`2`, 报错
df[[col1, col2]] # 选出两列, 返回DataFrame

4.5.3 按轴标签.loc

df.loc[<行表达式>, <列表达式>]
表达式支持:

  • [A, B, C]
  • [True, False, …]
  • A:C
  • A
  • Exp
  • Fun
df.loc[0]
df.set_index('name').loc['Ben']
df.loc[[0, 5, 10]] # 选择多行
df.set_index('name').loc[['Eli', 'Ben']]
df.loc[[False, True]*50] # 间隔显示, 只显示True的行

df.loc[0:5] # 筛选0-4行
df.loc['2010':'2014'] # 筛选2010-2014的行, 文本包含左右
df.loc[:] # 所有行

# 列筛选, 必须有行表达式
df.loc[:, ['name', 'Q1']]
df.loc[0:9, ['Q1', 'Q2']]
df.loc[:10, 'Q1':] # 0-9行, Q1后所有的列包括Q1
df.loc[:, :] # 所有

4.5.4 按数字索引.iloc

传入的表达式与.loc相同, 可以使用数字索引进行筛选

df.iloc[:3] # 0-2行
df.iloc[:]
df.iloc[2:20:3] # 2-19行, 步长3
df.iloc[:3, [0, 1]] # 0-2行, 0,1列
df.iloc[:3, :] # 0-2行
df.iloc[:3, :-2] # 0-2行, -3列之前所有列包含-3列

4.5.5 取具体值.at/.iat

df.at[<索引>, <列名>] 类似于.loc, 使用率比较低

df.at[4, 'Q1'] # =loc
df.iat[4, 2] # iloc

4.5.6 获取数据.get

类似字典的get, df.get(key, default=None), 如果是DataFrame, key需要传入列名, 返回的是Series, 如果是Series, 需要传入索引, 返回的是一个定值

df.get('name', 0) # name是列名
df.get('nameXXX', 0) # 如果找不到nameXXX的列, 返回0
s.get(3, 0) # 如果Series有index=3的记录, 则返回值, 没有返回0

4.5.7 数据截取.truncate

df.truncate() 可以对DataFrame和Series进行截取, 将before和after参数以外的数据剔除
作用上来讲 与iloc类似
truncate -> 返回一个新DataFrame
iloc -> 返回一个对象可以修改原DataFrame
部分关于view与copy的知识, 参考: https://blog.csdn.net/Mart_inn/article/details/126242842

df.truncate(before=2, after=4) # =iloc[2:5]

4.5.8 索引选择器pd.IndexSlice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值