pandas索引


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: 其它可选参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值