Pandas中MultiIndex选择并提取任何行和列

目录
  • 选择并提取带有loc的任何行或列
    • 特殊切片规范:slice(),pd.IndexSlice []
  • xs方法
  • 给选择赋值

使用多索引(分层索引)可以方便地对pandas.DataFrame和pandas.Series的索引进行分层配置,以便可以为每个层次结构计算统计信息,例如总数和平均值。

以下csv数据为例。每个索引列都命名为level_x。

import pandas as pd

df = pd.read_csv('./data/25/sample_multi.csv', index_col=[0, 1, 2])
print(df)
#                          val_1  val_2
# level_1 level_2 level_3
# A0      B0      C0          98     90
#                 C1          44      9
#         B1      C2          39     17
#                 C3          75     71
# A1      B2      C0           1     89
#                 C1          54     60
#         B3      C2          47      6
#                 C3          16      5
# A2      B0      C0          75     22
#                 C1          19      4
#         B1      C2          25     52
#                 C3          57     40
# A3      B2      C0          64     54
#                 C1          27     96
#         B3      C2         100     77
#                 C3          22     50

print(df.index)
# MultiIndex(levels=[['A0', 'A1', 'A2', 'A3'], ['B0', 'B1', 'B2', 'B3'], ['C0', 'C1', 'C2', 'C3']],
#            labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]],
#            names=['level_1', 'level_2', 'level_3'])

这里,将描述以下内容。

  • 选择并提取带有loc的任何行或列

    • 特殊切片规范:slice(),pd.IndexSlice []
  • xs方法
  • 给选择赋值

选择并提取带有loc的任何行或列

可以像使用普通索引一样使用loc []选择和提取任何行/列。

Pandas获取和修改任意位置的值(at,iat,loc,iloc)

在示例中,索引是一个多索引,但是当列是一个多索引时,同样的想法也适用。

如果选择上层(外层),则它与普通loc []相同。

指定整列时,可以省略back slice :,但是使用后述的slice(None)或pd.IndexSlice时,不能将其省略(这会导致错误),因此请明确指定。拥有它是安全的。

print(df.loc['A0', 'val_1'])
# level_2  level_3
# B0       C0         98
#          C1         44
# B1       C2         39
#          C3         75
# Name: val_1, dtype: int64

print(df.loc['A0', :])
#                  val_1  val_2
# level_2 level_3              
# B0      C0          98     90
#         C1          44      9
# B1      C2          39     17
#         C3          75     71

print(df.loc['A0'])
#                  val_1  val_2
# level_2 level_3              
# B0      C0          98     90
#         C1          44      9
# B1      C2          39     17
#         C3          75     71

也可以通过切片或列表选择范围。

print(df.loc['A0':'A2', :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B0      C0          98     90
#                 C1          44      9
#         B1      C2          39     17
#                 C3          75     71
# A1      B2      C0           1     89
#                 C1          54     60
#         B3      C2          47      6
#                 C3          16      5
# A2      B0      C0          75     22
#                 C1          19      4
#         B1      C2          25     52
#                 C3          57     40

print(df.loc[['A0', 'A2'], :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B0      C0          98     90
#                 C1          44      9
#         B1      C2          39     17
#                 C3          75     71
# A2      B0      C0          75     22
#                 C1          19      4
#         B1      C2          25     52
#                 C3          57     40

还可以通过从上层(外层)按顺序指定值来缩小范围。按元组顺序指定值。

print(df.loc[('A0', 'B1'), :])
#          val_1  val_2
# level_3              
# C2          39     17
# C3          75     71

print(df.loc[('A0', 'B1', 'C2'), :])
# val_1    39
# val_2    17
# Name: (A0, B1, C2), dtype: int64

如果按顺序指定元组,则列表将起作用,但切片将失败。

print(df.loc[(['A0', 'A1'], ['B0', 'B3']), :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B0      C0          98     90
#                 C1          44      9
# A1      B3      C2          47      6
#                 C3          16      5

# print(df.loc[(:, 'B1'), :])
# SyntaxError: invalid syntax

# print(df.loc[('A1':'A3', 'B2'), :])
# SyntaxError: invalid syntax

特殊切片规范:slice(),pd.IndexSlice []

当从具有多索引的上层(外层)开始按顺序指定元组的值时,将slice()用于切片。

可以使用slice(start,stop,step)创建slice start:stop:step。stop和step可以省略。整个切片:slice(None)。

print(df.loc[(slice(None), 'B1'), :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B1      C2          39     17
#                 C3          75     71
# A2      B1      C2          25     52
#                 C3          57     40

print(df.loc[(slice('A1', 'A3'), 'B2'), :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A1      B2      C0           1     89
#                 C1          54     60
# A3      B2      C0          64     54
#                 C1          27     96

print(df.loc[(slice('A1', 'A3'), ['B0', 'B2'], 'C1'), :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A1      B2      C1          54     60
# A2      B0      C1          19      4
# A3      B2      C1          27     96

如果使用pd.IndexSlice [],则可以指定为:。如果使用许多切片,这会更容易。

print(df.loc[pd.IndexSlice[:, 'B1'], :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B1      C2          39     17
#                 C3          75     71
# A2      B1      C2          25     52
#                 C3          57     40

print(df.loc[pd.IndexSlice['A1':'A3', 'B2'], :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A1      B2      C0           1     89
#                 C1          54     60
# A3      B2      C0          64     54
#                 C1          27     96

print(df.loc[pd.IndexSlice['A1':'A3', ['B0', 'B2'], 'C1'], :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A1      B2      C1          54     60
# A2      B0      C1          19      4
# A3      B2      C1          27     96

xs方法

还可以通过使用xs()方法指定索引列名称(参数level)及其值(第一个参数key)来选择和提取,多索引columns的参数axis= 1。

print(df.xs('B1', level='level_2'))
#                  val_1  val_2
# level_1 level_3
# A0      C2          39     17
#         C3          75     71
# A2      C2          25     52
#         C3          57     40

也可以使用代表层次结构级别的数值而不是索引列名称来指定。顶层(最外层)为0。

print(df.xs('C1', level=2))
#                  val_1  val_2
# level_1 level_2
# A0      B0          44      9
# A1      B2          54     60
# A2      B0          19      4
# A3      B2          27     96

还可以为多个索引指定值列表。

print(df.xs(['B1', 'C2'], level=['level_2', 'level_3']))
#          val_1  val_2
# level_1
# A0          39     17
# A2          25     52

要在xs()方法中指定切片,需要使用slice()或pd.IndexSlice []。

print(df.xs(pd.IndexSlice['A1':'A3'], level='level_1'))
#                  val_1  val_2
# level_2 level_3              
# B2      C0           1     89
#         C1          54     60
# B3      C2          47      6
#         C3          16      5
# B0      C0          75     22
#         C1          19      4
# B1      C2          25     52
#         C3          57     40
# B2      C0          64     54
#         C1          27     96
# B3      C2         100     77
#         C3          22     50

print(df.xs(slice('A1', 'A3'), level='level_1'))
#                  val_1  val_2
# level_2 level_3              
# B2      C0           1     89
#         C1          54     60
# B3      C2          47      6
#         C3          16      5
# B0      C0          75     22
#         C1          19      4
# B1      C2          25     52
#         C3          57     40
# B2      C0          64     54
#         C1          27     96
# B3      C2         100     77
#         C3          22     50

xs()方法无法在列表中指定多个值。如果要在列表中指定多个值,请使用loc []。

# print(df.xs(['B1', 'B2'], level='level_2'))
# KeyError: ('B1', 'B2')

print(df.loc[pd.IndexSlice[:, ['B1', 'B2']], :])
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B1      C2          39     17
#                 C3          75     71
# A1      B2      C0           1     89
#                 C1          54     60
# A2      B1      C2          25     52
#                 C3          57     40
# A3      B2      C0          64     54
#                 C1          27     96

给选择赋值

使用loc选择时,可以为选择范围分配一个值。

df.loc[(['A0', 'A1'], ['B0', 'B3']), :] = -100

print(df)
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B0      C0        -100   -100
#                 C1        -100   -100
#         B1      C2          39     17
#                 C3          75     71
# A1      B2      C0           1     89
#                 C1          54     60
#         B3      C2        -100   -100
#                 C3        -100   -100
# A2      B0      C0          75     22
#                 C1          19      4
#         B1      C2          25     52
#                 C3          57     40
# A3      B2      C0          64     54
#                 C1          27     96
#         B3      C2         100     77
#                 C3          22     50

df.loc[(['A0', 'A1'], ['B0', 'B3']), :] = [-200, -300]

print(df)
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B0      C0        -200   -300
#                 C1        -200   -300
#         B1      C2          39     17
#                 C3          75     71
# A1      B2      C0           1     89
#                 C1          54     60
#         B3      C2        -200   -300
#                 C3        -200   -300
# A2      B0      C0          75     22
#                 C1          19      4
#         B1      C2          25     52
#                 C3          57     40
# A3      B2      C0          64     54
#                 C1          27     96
#         B3      C2         100     77
#                 C3          22     50

df.loc[(['A0', 'A1'], ['B0', 'B3']), :] = [[-1, -2], [-3, -4], [-5, -6], [-7, -8]]

print(df)
#                          val_1  val_2
# level_1 level_2 level_3              
# A0      B0      C0          -1     -2
#                 C1          -3     -4
#         B1      C2          39     17
#                 C3          75     71
# A1      B2      C0           1     89
#                 C1          54     60
#         B3      C2          -5     -6
#                 C3          -7     -8
# A2      B0      C0          75     22
#                 C1          19      4
#         B1      C2          25     52
#                 C3          57     40
# A3      B2      C0          64     54
#                 C1          27     96
#         B3      C2         100     77
#                 C3          22     50

xs()仅获取该值,而无法分配它。

# df.xs(['B1', 'C2'], level=['level_2', 'level_3']) = 0
# SyntaxError: can't assign to function call

到此这篇关于Pandas中MultiIndex选择并提取任何行和列的文章就介绍到这了,更多相关Pandas MultiIndex提取行列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Pandas DataFrame数据的更改、插入新增的列和行的方法

    一.更改DataFrame的某些值 1.更改DataFrame中的数据,原理是将这部分数据提取出来,重新赋值为新的数据. 2.需要注意的是,数据更改直接针对DataFrame原数据更改,操作无法撤销,如果做出更改,需要对更改条件做确认或对数据进行备份. 代码: import pandas as pd df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['

  • pandas全表查询定位某个值所在行列的方法

    如下所示: # create a dataframe with an integer feature and a categorical string feature demo_df = pd.DataFrame({'Integer Feature': [0, 1, 2, 1], 'Categorical Feature': ['socks', 'fox', 'socks', 'box']}) demo_df 接下来用for遍历: for indexs in demo_df.index: for

  • pandas.DataFrame删除/选取含有特定数值的行或列实例

    1.删除/选取某列含有特殊数值的行 import pandas as pd import numpy as np a=np.array([[1,2,3],[4,5,6],[7,8,9]]) df1=pd.DataFrame(a,index=['row0','row1','row2'],columns=list('ABC')) print(df1) df2=df1.copy() #删除/选取某列含有特定数值的行 #df1=df1[df1['A'].isin([1])] #df1[df1['A'].

  • Python中pandas dataframe删除一行或一列:drop函数详解

    用法:DataFrame.drop(labels=None,axis=0, index=None, columns=None, inplace=False) 在这里默认:axis=0,指删除index,因此删除columns时要指定axis=1: inplace=False,默认该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe: inplace=True,则会直接在原数据上进行删除操作,删除后就回不来了. 例子: >>>df = pd.DataFrame(np.a

  • python pandas dataframe 按列或者按行合并的方法

    concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False) objs 是需要拼接的对象集合,一般为列表或者字典 axis=0 是

  • pandas 对每一列数据进行标准化的方法

    两种方式 >>> import numpy as np >>> import pandas as pd Backend TkAgg is interactive backend. Turning interactive mode on. >>> np.random.seed(1) >>> df_test = pd.DataFrame(np.random.randn(4,4)* 4 + 3) >>> df_test 0

  • pandas对dataFrame中某一个列的数据进行处理的方法

    背景:dataFrame的数据,想对某一个列做逻辑处理,生成新的列,或覆盖原有列的值 下面例子中的df均为pandas.DataFrame()的数据 1.增加新列,或更改某列的值 df["列名"]=值 如果值为固定的一个值,则dataFrame中该列所有值均为这个数据 2.处理某列 df["列名"]=df.apply(lambda x:方法名(x,入参2),axis=1) 说明: 1.方法名为单独的方法名,可以处理传入的x数据 2.x为每一行的数据,做为方法的入参1

  • python中pandas.DataFrame对行与列求和及添加新行与列示例

    本文介绍的是python中pandas.DataFrame对行与列求和及添加新行与列的相关资料,下面话不多说,来看看详细的介绍吧. 方法如下: 导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFrame(np.random.randn(4, 5), columns=['A', 'B', 'C', 'D', 'E']) DataFrame数据预览: A

  • pandas按行按列遍历Dataframe的几种方式

    遍历数据有以下三种方法: 简单对上面三种方法进行说明: iterrows(): 按行遍历,将DataFrame的每一行迭代为(index, Series)对,可以通过row[name]对元素进行访问. itertuples(): 按行遍历,将DataFrame的每一行迭代为元祖,可以通过row[name]对元素进行访问,比iterrows()效率高. iteritems():按列遍历,将DataFrame的每一列迭代为(列名, Series)对,可以通过row[index]对元素进行访问. 示例

  • Pandas中MultiIndex选择并提取任何行和列

    目录 选择并提取带有loc的任何行或列 特殊切片规范:slice(),pd.IndexSlice [] xs方法 给选择赋值 使用多索引(分层索引)可以方便地对pandas.DataFrame和pandas.Series的索引进行分层配置,以便可以为每个层次结构计算统计信息,例如总数和平均值. 以下csv数据为例.每个索引列都命名为level_x. import pandas as pd df = pd.read_csv('./data/25/sample_multi.csv', index_c

  • 用pandas中的DataFrame时选取行或列的方法

    如下所示: import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.arange(3.)) data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) data['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型 data.w #选择表格

  • 在pandas中一次性删除dataframe的多个列方法

    之前沉迷于使用index删除,然而发现pandas貌似有bug? import pandas as pd import numpy as np df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['A', 'B', 'C', 'D']) x=[1,2] df.drop(index=[1,2], axis=1, inplace=True) #axis=1,试图指定列,然并卵 print df 输出为 A B C D 0 0 1 2 3 还是

  • 详解pandas中MultiIndex和对象实际索引不一致问题

    在最新版的pandas中(不知道之前的版本有没有这个问题),当我们对具有多层次索引的对象做切片或者通过df[bool_list]的方式索引的时候,得到的新的对象尽管实际索引已经发生了改变,但是当直接使用df_new.index调取新对象的MultiIndex对象的时候,这个MultiIndex对象还是和原对象的索引保持一致的,而不是和新对象的实际索引保持一致.这点需要特别注意,因为正常情况下,我们自然会认为df.index的MultiIndex对象和df的实际索引是一致的,基于此,我们可能会写出

  • Python中反转二维数组的行和列问题

    目录 Python反转二维数组的行和列 python数组反转 总结 Python反转二维数组的行和列 代码如下: import numpy as np arr=np.arange(12).reshape(4,3) print("原数组") print(arr) print("翻转行") print(arr[::-1]) print("翻转列") print(arr[:,::-1]) 结果如下: 原数组[[ 0  1  2] [ 3  4  5] 

  • python pandas库中DataFrame对行和列的操作实例讲解

    用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.arange(3.)) data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) data['w'] #选择表格中的'w'列,使用类字典属性,返回的是S

  • python中pandas库中DataFrame对行和列的操作使用方法示例

    用pandas中的DataFrame时选取行或列: import numpy as np import pandas as pd from pandas import Sereis, DataFrame ser = Series(np.arange(3.)) data = DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz')) data['w'] #选择表格中的'w'列,使用类字典属性,返回的是S

  • pandas中的DataFrame按指定顺序输出所有列的方法

    问题: 输出新建的DataFrame对象时,DataFrame中各列的显示顺序和DataFrame定义中的顺序不一致. 例如: import pandas as pd grades = [48,99,75,80,42,80,72,68,36,78] df = pd.DataFrame( {'ID': ["x%d" % r for r in range(10)], 'Gender' : ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'M', 'M'],

  • pandas中提取DataFrame某些列的一些方法

    目录 前言 方法一:df[columns] 方法二:df.loc[]:用 label (行名或列名)做索引. 方法三:df.iloc[]: i 表示 integer,用 integer location(行或列的整数位置,从0开始)做索引. 补充:提取所有列名中包含“线索”.“浏览”字段的列 参考: 总结 前言 在处理表格型数据时,一行数据是一个 sample,列就是待提取的特征.怎么选取其中的一些列呢?本文分享一些方法. 使用如下的数据作为例子: import pandas as pd dat

  • Python  处理 Pandas DataFrame 中的行和列

    目录 处理列 处理行 前言: 数据框是一种二维数据结构,即数据以表格的方式在行和列中对齐.我们可以对行/列执行基本操作,例如选择.删除.添加和重命名.在本文中,我们使用的是nba.csv文件. 处理列 为了处理列,我们对列执行基本操作,例如选择.删除.添加和重命名. 列选择:为了在 Pandas DataFrame 中选择一列,我们可以通过列名调用它们来访问这些列. # Import pandas package import pandas as pd # 定义包含员工数据的字典 data =

随机推荐