Python 在apply()lambda中需要两列时,在多索引数据帧上添加groupby()

Python 在apply()lambda中需要两列时,在多索引数据帧上添加groupby(),python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个多索引数据框,我想在其中创建一个新列。在此新列中,该特定索引的所有行的值应来自“type”为“TX”的行中“bin”列的值。例如: From... type bin id desc 1 a TX 01110010 a RX 01110010 b TX 11110000 b RX 11110000 2

我有一个多索引数据框,我想在其中创建一个新列。在此新列中,该特定索引的所有行的值应来自“type”为“TX”的行中“bin”列的值。例如:

    From...
           type       bin
    id desc               
    1  a      TX  01110010
       a      RX  01110010
       b      TX  11110000
       b      RX  11110000
    2  a      RX  11101000
       b      TX  11110001
       b      RX  11110001

    What I want...
            type       bin    bin_tx
    id desc                         
    1  a      TX  01110010  01110010
       a      RX  00000010  01110010
       b      TX  11110000  11110000
       b      RX  11110000  11110000
    2  a      RX  11101000          
       b      TX  00110001  00110001
       b      RX  11110001  00110001

    What I get...
            type       bin bin_tx
    id desc                      
    1  a      TX  01110010    NaN
       a      RX  01110010    NaN
       b      TX  11110000    NaN
       b      RX  11110000    NaN
    2  a      RX  11101000    NaN
       b      TX  11110001    NaN
       b      RX  11110001    NaN
我的问题是,当我尝试在groupby上使用apply()时,列“bin_tx”对于所有行返回为NaN。我想这与熊猫不知道如何处理groupby和原始df之间的不同指数有关

但是,如果我尝试使用transform(),这当然会一次处理一列,也就是说,我无法从“bin”列获取值

MWE:

修正你的代码

s=df3.groupby(level=[0,1]).apply(lambda x: x.bin.values[0] if (x.type == 'TX').any() else '')
out=df3.join(s.to_frame('binTX'),how='left')
        type       bin     binTX
id desc                         
1  a      TX  01110010  01110010
   a      RX  01110010  01110010
   b      TX  11110000  11110000
   b      RX  11110000  11110000
2  a      RX  11101000          
   b      TX  11110001  11110001
   b      RX  11110001  11110001
请解释一下你的代码(你倾向于在你的部分但不是全部(即,
IIUC…
)中不这么做),比如你是如何修复OP的代码的。
s=df3.groupby(level=[0,1]).apply(lambda x: x.bin.values[0] if (x.type == 'TX').any() else '')
out=df3.join(s.to_frame('binTX'),how='left')
        type       bin     binTX
id desc                         
1  a      TX  01110010  01110010
   a      RX  01110010  01110010
   b      TX  11110000  11110000
   b      RX  11110000  11110000
2  a      RX  11101000          
   b      TX  11110001  11110001
   b      RX  11110001  11110001