具有重复值的Python多索引切片



我有一个问题,用带有重复的多索引的panda对数据进行切片。

假设我有一张桌子(a和B是标记(

A B C
1 1 11
1 2 12
1 3 13
2 1 21
2 2 22
2 3 23
and so on
And to vectors
a = [1, 2, 3, 1, 2, 1, 2 ]
b = [3, 2, 1, 3, 2, 1, 3 ]

我想以一种返回向量c的方式对表进行切片,该向量c的值与向量a和b的标记一致。

c = [13, 22, 31, 13, 22, 11, 23] 

我想到的唯一一件事就是调整这个表并获得:

A B1 B2 B3
1 11 12 13
2 21 22 23
3 31 32 33

通过loc对列A应用一个索引以获得适当的行,与指示符矩阵相乘以为每行选择适当的列,并求和以获得向量(使用另一个切片(。我确信肯定有更简单的方法,但我找不到合适的方法来做

您可以使用ab阵列创建一个新的MultiIndex,然后创建reindex您的数据帧:

样本数据

import pandas as pd
index = pd.MultiIndex.from_product([[1,2,3], [1,2,3]])
df = pd.DataFrame({"C": [11, 12, 13, 21, 22, 23, 31, 32, 33]}, index=index)
print(df) # dataframe with 2-level index and 1 column "C"
C
1 1  11
2  12
3  13
2 1  21
2  22
3  23
3 1  31
2  32
3  33

方法

  • ab阵列创建新的MultiIndex
  • 将数据帧(或仅感兴趣的列(与此新索引对齐
a = [1, 2, 3, 1, 2, 1, 2 ]
b = [3, 2, 1, 3, 2, 1, 3 ]
new_index = pd.MultiIndex.from_arrays([a, b])
new_c = df["C"].reindex(new_index)
print(new_c.to_numpy())
[13 22 31 13 22 11 23]

方法2

您还可以将ab阵列压缩在一起,只需使用.loc对数据帧进行切片:

# Select the rows specified by combinations of a, b; in column "C"
new_c = df.loc[zip(a, b), "C"]
print(new_c.to_numpy())
[13 22 31 13 22 11 23]

选项为merge:

pd.DataFrame({'A':a,'B':b}).merge(df, on=['A','B'], how='left')['C']

输出(注意,NaN值对应于df中数据不可用的位置(:

0    13.0
1    22.0
2     NaN
3    13.0
4    22.0
5    11.0
6    23.0
Name: C, dtype: float64

最新更新