对于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