根据另一列多级数据帧的值更改列的符号



对于0-62列的多级数据帧,我正在尝试基于C的符号来更改列的符号(X,V(。如果V已经是-ve,则使用条件不执行任何操作。

数据帧样本

0             1      
A         X  V  C       X  V  C      
0  foo  1.2  1 -2     1.3  2  4      
1  bar  4.1  4  6     1.2 -5 -1      

如果E是ve ,我试图实现的是更改所有列的C和D的符号

0             1      
A         X  V  C       X  V  C      
0  foo -1.2 -1 -2     1.3  2  4      
1  bar  4.1  4  6    -1.2 -5 -1    

我知道如何为简单df更改一列的符号,但不能为所有列的多级df更改符号。

df['V'] = df['V'].apply(lambda df['V']: if df['C'] >= 0 else df['C']*-1)

我只有下面的V代码,但它给出了错误,

df['V'] = (
df.loc[:,(slice(None),'V')]
.apply(lambda df.loc[:,(slice(None),'V')].iloc[:, 2:62]: 
if df.loc[:,(slice(None),'C')].iloc[:, 2:62][out.loc[:,(slice(None),'C')] >= 0]  
else df.loc[:,(slice(None),'V')].iloc[:, 2:62]*-1)
)
.apply(lambda df.loc[:,(slice(None),'V')].iloc[:, 2:62]:
^
SyntaxError: invalid syntax

让输入为:

df = pd.DataFrame({(0, 'X'): [-1.2, 4.1],
(0, 'V'): [-1, 4],
(0, 'C'): [-2, 6],
(1, 'X'): [1.3, -1.2],
(1, 'V'): [2, -5],
(1, 'C'): [4, -1]},
index=pd.MultiIndex.from_arrays([(0, 1), ('foo', 'bar')])
)

0          1      
X  V  C    X  V  C
0 foo -1.2 -1 -2  1.3  2  4
1 bar  4.1  4  6 -1.2 -5 -1

一般的逻辑是确定每"1"列C的符号;组";,然后将其应用于原始数据的绝对值。

棘手的是使用多索引。

我看到两种选择。

选项1:重新索引

import numpy as np
SIGN = np.sign(df.xs('C', axis=1, level=1, drop_level=False))
abs(df)*SIGN.reindex(columns=df.columns).bfill(axis=1)

输出:

0              1          
X    V    C    X    V    C
0 foo -1.2 -1.0 -2.0  1.3  2.0  4.0
1 bar  4.1  4.0  6.0 -1.2 -5.0 -1.0

标志:

0  1
C  C
0 foo -1  1
1 bar  1 -1

选项2:堆叠/卸载

import numpy as np
(abs(df).stack(0)
.multiply(np.sign(df.xs('C', axis=1, level=1)).stack(), axis=0)
.unstack(-1).swaplevel(axis=1).sort_index(axis=1, level=0, sort_remaining=False)
)

输出:

0          1        
C  V    X  C  V    X
0 foo -2 -1 -1.2  4  2  1.3
1 bar  6  4  4.1 -1 -5 -1.2

最新更新