本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
数据切片/筛选/取值
1. 源数据
az = 'abcdefghijklmnopqrstuvwxyz'
data = pd.DataFrame([[j for j in range(i, 10 + i)] for i in range(20)], columns=list(az.upper()[:10]), index=[i+j for i in az for j in az][:20])
2. 切片
2.1 行切片
# 取前10行
data.head(10)
data.iloc[:10]
# 取第3-15行
data.iloc[2:15]
# 取后10行
data.tail(10)
data.iloc[-10:]
# 取奇数行
data.iloc[::2]
# 取偶数行
data.iloc[1::2]
# 取索引为af及其之后的行
data.loc['af':]
# 取索引为af及其之后的奇数行(af为第1行)
data.loc['af'::2]
# 取索引af及ai之间的行(包含边界)
data.loc['af':'ai']
2.2 列切片
# 取前5列
data.iloc[:, :5]
# 取第3-5列
data.iloc[:, 2:5]
# 取后5列
data.iloc[:, -5:]
# 取奇数列
data.iloc[:, ::2]
# 取偶数列
data.iloc[:, 1::2]
# 取索引为C及其之后的列
data.loc[:, 'C':]
# 取索引为C及其之后的奇数列(af为第1行)
data.loc[:, 'C'::2]
# 取索引C及F之间的列(包含边界)
data.loc[:, 'C':'F']
1.3 行列组合切片
# 取前10行的前5列
data.iloc[:10, :5]
...
2. 取固定行/列/值及按条件筛选
# 取索引为 aa, ae, af 的行
data.loc[['aa', 'ae', 'af']]
# 取 A, C, F 列
data[['A', 'C", 'F]]
data.loc[:, ['A', 'C', 'F']]
# 取 C 列 索引为 ae 的值
data['C']['ae']
data.loc['ae', 'C']
data.at['ae', 'C']
# 取C列值大于10的数据
data[data['C'] > 10]
data.loc[data.C > 10]
# 取ak行值大于15的列
data.loc[:, data.loc['ak'] > 15]
# 取D列值在[7, 9, 13]中的数据
data[data['D'].isin([7, 9, 13])]
替换/填充/新增
1. 原数据
data = pd.DataFrame([
[np.nan, 2, np.nan, 0],
[True, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]
], columns=list('ABCD'))
以下所有操作如无特殊说明均是生成新对象而不是修改原对象
2. 索引替换/修改
以下赋值操作会修改原对象, 函数操作均生成新对象
# 将第一列设为索引
data.set_index(0)
# 将索引设置为0-n
data.index = range(len(data))
# 将索引设置为['a', 'b', 'c', 'd']
data.index = ['a', 'b', 'c', 'd']
# 设置索引的名字为index
data.index.name='index'
# 将索引 0 替换为 a
data.rename({0: 'a'})
# 将列名 B 替换为 BB
data.rename({'B': 'BB'}, axis=1)
# 将列名设置为['AA', 'BB', 'CC', 'DD']
data.columns = ['AA', 'BB', 'CC', 'DD']
3. 值替换/缺失值处理
以下方法均可以用limit限制替换次数
# 将 1 和 True 替换为 100
# 由于在python中 True == 1 , 所以替换1或True都会对两者全部替换
data.replace({True: 100})
# 将列D的值1替换为100
data.replace({'D': {1: 100}})
# 将所用空值(None, NaN)替换为0
data.fillna(0)
# 将A列的空值替换为False, B列的空值替换为0
data.fillna({'A': False, 'B': 0})