目录
pandas数据框索引是其重要组成部分,类似于excel中的行列名称,可用于筛选、汇总、合并数据。本文介绍索引生成、多级索引、索引重置、索引使用。
将索引重置成列或删除reset_index()
官方文档链接
语法: DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=’’)
参数说明:
- level: int, str, tuple, or list, default None。给定要重置的索引,int指定第几级索引,str指定索引名称(如果有),stuple或list指定多个索引(针对多级索引),None重置所有索引
- drop: bool, default False。是否将要重置的索引插入到数据框列中
- inplace: bool, default False。是否原地操作数据框
- col_level: int or str, default 0。若数据框列是多级索引,将重置的行索引插入数据框后,指定其列索引等级
- col_fill: object, default ‘’。若数据框列是多级索引,将重置的行索引插入数据框并设定其索引等级后,其余列索引等级名称
import numpy as np
import pandas as pd
columns = [['class1', 'class1', 'class2', 'class2', 'class2'],
['name', 'age', 'name', 'age', 'height']]
index = [['white', 'white', 'white', 'blue', 'blue', 'red', 'red', 'red'],
['up', 'down', 'right', 'up', 'down', 'up', 'down', 'left']]
fra = pd.DataFrame(np.random.random([8, 5]), index=index, columns=columns)
fra
Out[28]:
class1 class2
name age name age height
white up 0.615977 0.323556 0.529403 0.854227 0.417047
down 0.252984 0.744790 0.151405 0.275784 0.025775
right 0.685214 0.605265 0.193832 0.416786 0.547755
blue up 0.267246 0.219455 0.568687 0.509591 0.078756
down 0.072221 0.034677 0.790222 0.128744 0.993082
red up 0.234485 0.747283 0.239909 0.621189 0.242915
down 0.462811 0.352136 0.008509 0.043840 0.796900
left 0.148628 0.977315 0.879377 0.988451 0.612621
fra.reset_index(level=1, col_level=1, col_fill='test')
Out[4]:
test class1 class2
level_1 name age name age height
white up 0.512819 0.976225 0.066507 0.336387 0.617752
white down 0.000550 0.914401 0.846046 0.801646 0.181506
white right 0.176204 0.468514 0.731324 0.218729 0.263762
blue up 0.658551 0.791292 0.335346 0.427632 0.970375
blue down 0.549378 0.340649 0.793492 0.993348 0.854131
red up 0.322048 0.145388 0.394169 0.188444 0.396524
red down 0.143161 0.711285 0.246570 0.225234 0.270444
red left 0.204862 0.905399 0.475958 0.292878 0.861517
将某些列设置成索引set_index()
官方文档链接
语法: DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数说明:
- keys: column label or list of column labels。要设置成行索引的列
- drop: boolean, default True。是否删除原来的列
- append: boolean, default False。是否在现有行索引基础上添加新索引
- inplace: boolean, default False。是否原地操作
- verify_integrity: boolean, default False。是否检测新索引中的重复值
调整索引顺序、删除或新增索引、自动填充
官方文档链接
语法: DataFrame.reindex(labels=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
参数说明:
- labels: 新的索引数组,如果是多级索引,则以tuple形式传递参数
- axis: 指定修改的是行还是列,0行1列
- method: 缺失值填充方式,只有索引是单调递增或递减时才能用
- None(default):不填充
- ffill:使用前一个元素填充
- bfill:使用后一个元素填充
- nearest:使用最近的元素填充 - copy: bool, default True
- level: int or name。对于多级索引,指定labels要修改的是第几级索引
- fill_value: scalar, default np.NaN。缺失值填充
- limit: 向前向后填充最大个数,与method一块使用
a = pd.Series([1, 2, 3], index=[1, 4, 6])
a
Out[40]:
1 1
4 2
6 3
dtype: int64
a.reindex(range(7), method='ffill', limit=1, fill_value='missing')
Out[41]:
0 missing #前边没有值,所以使用指定值填充
1 1
2 1
3 missing #limit限制只能向后填充一次,故索引3使用指定值填充
4 2
5 2
6 3
dtype: object
columns = [['class1', 'class1', 'class2', 'class2', 'class2'],
['name', 'age', 'name', 'age', 'height']]
index = [['white', 'white', 'white', 'blue', 'blue', 'red', 'red', 'red'],
['up', 'down', 'right', 'up', 'down', 'up', 'down', 'left']]
fra = pd.DataFrame(np.random.random([8, 5]), index=index, columns=columns)
fra
Out[42]:
class1 class2
name age name age height
white up 0.099309 0.487201 0.845269 0.846761 0.048085
down 0.368589 0.234458 0.099907 0.696038 0.949374
right 0.599519 0.234983 0.789913 0.115055 0.112387
blue up 0.659007 0.949184 0.876051 0.165612 0.354524
down 0.187546 0.220492 0.031173 0.442702 0.049742
red up 0.853771 0.741749 0.524701 0.728447 0.232286
down 0.244801 0.751433 0.524760 0.920340 0.569083
left 0.342613 0.909471 0.646130 0.658234 0.547701
#调整一级索引顺序且删除索引blue
fra.reindex(['red', 'white'], level=0)
Out[43]:
class1 class2
name age name age height
red up 0.853771 0.741749 0.524701 0.728447 0.232286
down 0.244801 0.751433 0.524760 0.920340 0.569083
left 0.342613 0.909471 0.646130 0.658234 0.547701
white up 0.099309 0.487201 0.845269 0.846761 0.048085
down 0.368589 0.234458 0.099907 0.696038 0.949374
right 0.599519 0.234983 0.789913 0.115055 0.112387
重命名索引名称
官方文档
语法: DataFrame.rename(mapper=None, axis=None, copy=True, inplace=False, level=None, errors=‘ignore’)
参数说明:
- mapper: {old1 : new1, old1 : new1, ……}
- axis: 0行索引,1列索引
- level: int or level name,表示要mapper对应第几级索引
- errors: ignore,忽略数据框没有但是mapper中有的索引;raise,引发错误。
stack()列转行,拉长数据框
适用于多级列索引,将其中某一级或几级转换成行。
语法: DataFrame.stack(self, level=-1, dropna=True)
参数说明:
- level: int, str, list, default -1。指定要转换的哪级列索引,默认最内层一级。
- dropna: bool, default True。删除换行后全是NaN的行。
df = pd.DataFrame([[None, 1.0], [2.0, 3.0]], index=['cat', 'dog'], columns=[['weight', 'kg'], ['height', 'm']])
df
Out[85]:
weight kg
height m
cat NaN 1.0
dog 2.0 3.0
df.stack(dropna=True)
Out[86]:
kg weight
cat m 1.0 NaN
dog height NaN 2.0
m 3.0 NaN
df.stack(dropna=False)#不删除全是NaN的行
Out[87]:
kg weight
cat height NaN NaN
m 1.0 NaN
dog height NaN 2.0
m 3.0 NaN
df.stack(level=[0, 1]) #将所有列索引都转换成行
Out[88]:
cat kg m 1.0
dog kg m 3.0
weight height 2.0
dtype: float64
unstack()行转列,加宽数据框
语法: DataFrame.unstack(level=-1, fill_value=None)
参数说明:
- level:int, string, or list of these, default -1 (last level)。指定要转换的等级索引,可以指定多级,默认是最内层一级。
- fill_value:使用指定value替换转换产生的缺失值nan。
columns = ['a', 'b']
index = [['white', 'white', 'white', 'white', 'white', 'white',
'blue', 'blue', 'blue', 'blue'],
['up', 'up', 'down', 'right', 'right', 'right', 'up',
'up', 'down', 'down'],
['cat', 'bird', 'lion', 'cat', 'bird', 'lion', 'bird',
'lion', 'cat', 'lion']]
fra = pd.DataFrame(np.random.random([10, 2]), index=index, columns=columns)
fra
Out[22]:
a b
white up cat 0.062473 0.428980
bird 0.085264 0.720022
down lion 0.218122 0.295369
right cat 0.540926 0.667320
bird 0.842825 0.609600
lion 0.078433 0.791531
blue up bird 0.860620 0.152855
lion 0.360273 0.830142
down cat 0.833308 0.585177
lion 0.048959 0.145129
fra.unstack(level=[0, 1], fill_value='missing_value')
Out[23]:
a ... b
white ... blue
up down ... up down
bird 0.0852644 missing_value ... 0.152855 missing_value
cat 0.0624735 missing_value ... missing_value 0.585177
lion missing_value 0.218122 ... 0.830142 0.145129
[3 rows x 10 columns]
按索引层级统计数据
语法: DataFrame.sum(self, axis=None, skipna=None, level=None, numeric_only=None, min_count=0, **kwargs)
参数说明:
- axis: {index (0), columns (1)}。0按列汇总,1按行汇总
- skipna: bool, default True。计算时是否剔除NA/null
- level: int or level name, default None。如果是多级索引,指定按哪一级汇总
- numeric_only: bool, default None。是否数据类型为float、int、bool的列。
- min_count: int, default 0。表示汇总的数据中至少需要有min_count个有效数据,否则计算结果就为NA。
- kwargs: 其它可选参数