pandas索引塑造及使用

Pandas创建/读取数据时通常会手动指定索引值或指定索引所在位置,如果不指定则默认索引为(0…n)的数字。由于Pandas各种数据结构的索引使用方法基本通用,故本章使用DataFrame为例。

若无特殊说明,文中所使用数据为用数据为 2016-2018北京高考分数线.xlsx

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200822090216.png
2016-2018北京高考分数线.xlsx

索引

切片索引

切片索引使用格式为data[row_index][col_index],尝试发现,切片索引与Python数组切片稍有不同,主要有以下几种情况:

  1. 选中特定行:data[m:n:step]
  2. 选择特定列: data['col1']data[['col1','col2']]
  3. 选择特定区域:data[row_index][col_index]
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200730105704.png
    切片索引

loc索引

loc索引使用格式为data.loc[row_index][col_index]data.loc[row_index, col_index],主要有以下几种情况(与上面大致相同):

  1. 选中特定行:data.loc[m:n:step](范围[m,n)
  2. 选择特定列: data.loc[['col1','col2']]
  3. 选择特定区域:data.loc[row_index][col_index]
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200730122354.png
    loc索引

iloc索引

iloc索引使用格式为data.iloc[row_index][col_index]data.iloc[row_index, col_index],主要有以下几种情况(与上面大致相同):

  1. 选中特定行:data.iloc[m:n:step](范围[m,n)
  2. 选择特定列: data.iloc[[col1,col2]]
  3. 选择特定区域:data.iloc[row_index][col_index]
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200730122512.png
    iloc索引

以上三种索引方式的差别:

索引方式 差别
切片 row_index既可以使用序号,也可以使用索引名、col_index只能使用索引名
直接通过DataFrame['column']的方式访问是列索引,直接通过通过切片的方式访问是行索引
loc row_indexcol_index只能使用索引名
直接通过DataFrame['row_index']和直接通过通过切片的方式访问都是行索引
iloc row_indexcol_index只能使用序号索引
直接通过DataFrame[row_index]和直接通过通过切片的方式访问都是行索引

xi索引

该方法已过时,不建议使用

条件索引

条件索引使用格式为data[query]data.loc[query]data.iloc[query],使用时目标数据列的数据格式最好一致,本节所使用数据为1

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200730174338.png
条件索引数据

主要有以下使用场景:

  1. 直接条件:data1[data1[1] > 500](文科一本分数线大于500的行)
  2. lambda函数:data1.iloc[lambda x: ((x[1] > 500) & (x[1] < 550)).tolist()](文科一本分数线大于500小于550的行)
    https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/20200730124600.png
    条件索引
信息
条件索引接受有返回值的函数作为参数,但要必须保证函数返回的是整数/整数list、布尔值/布尔list,否则会报错NotImplementedError: iLocation based boolean indexing on an integer type is not available。比如直接运行data1.iloc[lambda x: (x[1] > 500) & (x[1] < 550)],则因它返回的是series类型的数据而报错。

层次索引

本节使用数据:

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/202007301234.png
层次索引

构造

  1. 隐式构造 2
1
data.columns = [['一本分数线','一本分数线','二本分数线','二本分数线'],['文科','理科','文科','理科']]
  1. 显式构造
1
2
3
4
5
6
7
# 1. 从tuple
multiIndex = pd.MultiIndex.from_tuples([('一本分数线','文科'),('一本分数线','理科'),('二本分数线','文科'),('二本分数线','文科')])
# 2. 从list
multiIndex = pd.MultiIndex.from_arrays([['一本分数线','一本分数线','二本分数线','二本分数线'],['文科','理科','文科','理科']])
# 3. 从product
multiIndex = pd.MultiIndex.from_product([['一本分数线','二本分数线'],['文科','理科']])
data.columns = multiIndex

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/~%25IA60THB%5B%60V%7BOT%60ETGO%7DLL.png
显式构造

  1. 指定索引
1
data = pd.read_excel("2016-2018北京高考分数线.xlsx", header=[0, 1])

访问

层次索引使用格式为data[row_index][col_index]data.loc[row_index, col_index],其中多级索引以列表形式输入。例:

1
2
data[1:4]['一本分数线','文科']
data.loc[1:4,['一本分数线','文科']]

https://cdn.jsdelivr.net/gh/wefantasy/FileCloud/img/98FZ8$LJ0W9826G(Q9A@2C1.png
层次索引

其他

重塑索引

  1. reindex

pandas中的reindex方法可以为series和dataframe添加或者删除索引3,函数原型为:pd.reindex([index, columns, method, copy, level, fill_value, limit])

1
2
3
data.reindex(index=np.arange(10,0,-1))  # 重塑索引为[10,1],其余的数据舍弃
data.reindex(index=np.arange(100), fill_value = 10)   # 重塑索引为[0, 99],不足的数据用10填充(默认填充Nan)
data.reindex(index=np.arange(50), method='ffill'))   # 重塑索引为[0, 49],不足的数据按照前一个非nan的值填充进去
  1. reset_index

DataFrame可以通过reset_index还原索引,重新变为默认的整型索引,函数原型为:

1
reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

其中level控制了具体要还原的那个等级的索引,drop为False则原索引会被设置为新的列数据,否则会删除原索引。

参考


  1. SNII_629. [Pandas]数据选取/数据切片. CSDN. [2018-10-09] ↩︎

  2. 你好,小帝. pandas层次化索引. 博客园. [2017-10-26] ↩︎

  3. 我是小蚂蚁. pandas中的reindex用法. CSDN. [2018-10-26] ↩︎