如何在数据帧中使用grouby运行applymap函数?

2024-09-20 22:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在pandas数据帧中,我想使用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.productzip我不确定这个函数是否有用,但希望它能帮助读者。

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\u list+mcve”一次读取两行_列表.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和groupby('f1\u 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])
    

我没有得到任何错误,但功能部分混乱时,试图分组,然后申请。你知道吗

我也没有找到任何使用applymap和groupby的例子和教程。你知道吗


Tags: 函数inindexshiftalllistf1tgt

热门问题