Pandas多层次索引-在列之间执行算术运算



我有一个这样的数据帧:

arr = np.random.randint(10, 99, (4,4))
df = pd.DataFrame(arr)
df.columns = pd.MultiIndex.from_product([['X','Y'],['A','B']])

看起来是这样的:

X       Y    
A   B   A   B
0  76  78  29  24
1  34  80  83  56
2  56  44  40  30
3  16  38  45  93

对于其中A<X中的B,我想在Y中做A-B。我该怎么做?

我这样做是为了过滤并从Y 中选择A和B

df[df['X']['A'] < df['X']['B']].loc[:, ('Y', ['A', 'B'])]
Y
A   B
0   29  24
1   83  56
3   45  93

但我不知道如何做A-B.

谢谢。

假设您想用结果减去并更新A,您可以通过索引为:来完成

m = (df[('X','A')] < df[('X','B')])
df.loc[m,('Y','A')] = df.loc[m,('Y','A')] - df.loc[m,('Y','B')]

print(df)
X       Y    
A   B   A   B
0  77  67  55  87
1  36  85  26  50
2  77  14  62  89
3  88  33  82  44

您可以为MultiIndex按元组选择列,如:

np.random.seed(20)
arr = np.random.randint(10, 99, (4,4))
df = pd.DataFrame(arr)
df.columns = pd.MultiIndex.from_product([['X','Y'],['A','B']])
print (df)
X       Y    
A   B   A   B
0  25  38  19  30
1  85  32  81  44
2  50  95  36  93
3  26  72  26  17
mask = df[('X','A')].lt(df[('X','B')])
print (mask)
0     True
1    False
2     True
3     True
dtype: bool
s = df.loc[mask, ('Y','A')].sub(df.loc[mask, ('Y','B')])
print (s)
0   -11
2   -57
3     9
dtype: int32

最新更新