如何在pandas Dataframe中使用grouby运行applymap函数?

时间:2017-02-11 18:39:05

标签: python pandas dataframe lambda group-by

在pandas Dataframe中我想applymap(somefunction)使用groupby(使用一些列索引值),我发现这很难实现。

mcve_01.txt

pos         f1_index      M1       M2      F1_x 
16230484    141      G/G      G/G       G
16230491    141      C/C      C/C       C
16230503    141      T/T      T/T       T
16232072    211      A/A      A/A       A
16229783    211      C/C      C/C       G
16229992    211      A/A      A/A       G
16230007    211      T/T      T/T       A
16230011    263      G/G      G/G       C
16230049    263      A/A      A/A       T

我阅读了上述文件并将posf1_index设置为索引和其余列值列表:

mcve_data.set_index(['pos', 'index'], append= True, inplace = True)
mcve_list = mcve_data.applymap(lambda c:[list(c)])

所以,现在我想要读取两行(值)并使用下面描述的函数创建两个值的 itertools.product vs zip 我不确定这个功能是否有用,但希望它能帮助读者。

def mapfun(c):
if any(['.' in l for l in c]):
    return '.'

if all(['|' in l for l in c]):
    fun = zip

else:
    fun = product

filt_set = set(['|','/'])
filt = partial(filter,lambda l: not (l in filt_set))

return ','.join('g'.join(t) for t in fun(*map(filt, c)))

最终代码:我使用上面的函数并使用`mcve_list + mcve_list.shift(1):

一次读取两行
mcve_mm = (mcve_list+mcve_list.shift(1)).dropna(how='all').\
    applymap(mapfun)

给了我(最终输出)

pos    index      M1        M2      F1_x    
16230484    141  CgG,CgG,CgG,CgG        CgG,CgG,CgG,CgG         CgG
16230491    141  TgC,TgC,TgC,TgC        TgC,TgC,TgC,TgC         TgC
.....      ...   TgT,TgT,TgT,TgT        TgT,TgT,TgT,TgT         TgT

我想解决的问题 - 这就是问题所在:

上述(功能代码)和最终代码都可以,但现在我想为每个f1_index值分别运行该函数。当索引值发生变化时,按组执行此操作不会产生或压缩列表。

我尝试的事情:

  • 重置f1_index然后重新组合(' f1_index')

    mcve_group = mcve_list.reset_index(level=['f1_index'])
    mcve_group2 = mcve_group.groupby('f1_index')
    
    for x, group in mcve_group2:
        mcve_mm2 = (mcve_group2+mcve_group2.shift(1)).dropna(how='all').\
        apply(mapfun)
    

    而且,还有:

    mcve_mm2 = (mcve_group2+mcve_group2.shift(1)).dropna(how='all').\
        apply(lambda x: [mapfun(c) for c in x])
    
  • 使用groupby(' key')

    mcve_mm = (mcve_list+mcve_list.shift(1)).groupby('f1_index').dropna(how='all').\
    applymap(mapfun)
    
  • 包装applymap

    mcve_mm = (mcve_list+mcve_list.shift(1)).dropna(how='all').groupby(['f1_index'], group_keys = False).apply(lambda x: [mapfun])
    

我没有收到任何错误,但在尝试groupby然后申请时,功能部分搞砸了。

我也没有找到任何在pandas df中使用applymap和groupby的示例和教程。

0 个答案:

没有答案