深入浅出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
…