在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
我阅读了上述文件并将pos
和f1_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的示例和教程。