基于pandas索引的数据查找、排序和去重小结
由于Pandas的索引比较复杂,常常在使用过程中容易搞混,所以整理一份关于索引的查找、排序、去重的总结文档。
import pandas as pd
import numpy as np
#定义DataFrame
dict={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
df=pd.DataFrame(dict,index=['one','two','three'])
df
a | b | c | |
---|---|---|---|
one | 1 | 4 | 7 |
two | 2 | 5 | 8 |
three | 3 | 6 | 9 |
1.Series通过索引查找
可用Index ,也可用数字下标
s1=df['b']
s1['two']
s1[['two','one']] # 用数组列出离散的标签,要用[ ]括起来
s1['two':'three'] # 标签切片
s1[0:2] # 标号切片的右区间是开的
2.DataFrame通过索引查找
(1) 直接通过列索引取列
df['b']
df[['b','c']] # 用数组列出离散的标签,要用[ ]括起来
(2) .loc 通过标签索引数据
- 先写行标签,后写列标签
- 列举多个列,要用数组,用[ ]括起来
- 列举切片,则无需用[ ]括起来。注意标签切片的右括号是闭合的
df.loc[['two','one']] #索引多行,行名用数组
df.loc['two':'three'] #索引多行,行名用切片
df.loc[:,['b','a']] #索引某行多列,列名用数组
df.loc[:,'b':'a'] #索引某行多列,列名用切片
(3) .iloc 通过通过标号获取数据
- 先写行号,再写列号
- 可用单值,也可用切片,注意:标号切片的右括号是开区间的
df.iloc[1:3,1:3]
3.索引和列之间的转换
(1) 列-->索引
- inplace参数可以定义是否覆盖原数据
df.set_index('a', inplace=True) # inplace=True 会在原变量直接改,没有返回值
df
df1=df.set_index('a', inplace=False) # inplace=False则有返回值(默认),原变量不变
df1
(2) 索引-->列
- 索引变成列会排在DataFrame的第一列
df.reset_index(inplace=True)
df
4.利用索引进行排序
- 通过索引排列,升序排列、不覆盖原数据、如有缺失值则放在前面
df.sort_index(ascending=True, inplace=False, na_position='first')
5.根据索引进行数据去重
- keep='first' or 'last',可以选择保留第一条或最后一条
df=df[~df.index.duplicated(keep='first')]