gpt4 book ai didi

python - 如何通过删除列表中的特定元素来为给定列表运行 itertools 产品?

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:40 25 4
gpt4 key购买 nike

在以下数据集 (mcve_01.txt) 中:

mcve_01.txt

pos         M1     M2      F1_x     F1_y    Sk1     S2    Sj
16230484 G/G G/G G T T/T T/T T/T
16230491 C/C C/C C T T/T . T/T
16230503 T/T T/T T T T/T . T/T
16230524 T/T T/T T A A/A A/A A/A
16230535 . . T C . . .
16232072 A/A A/A A G G/G G/G G/G
16232072 A/A A/A A G G/G G/G G/G
16229783 C/C C/C G C G/C G/C C|G
16229992 A/A A/A G A A/A A/A A|G
16230007 T/T T/T A T A|T A|T A|T
16230011 G/G G/G C G C|G C|G G/C
16230049 A/A A/A T A . A/T A/T
16230174 . . T C T|C T|C C|T
16230190 A/A A/A T A G|T T|G T|G
16230260 A/A A/A G A G/G G/G G/G
16230260 A/A A/A G A G/G G/G G/G
16232772 A/A A/A C A C/C C/C C/C
16232793 C/C C/C T C T/T T/T T/T
16232793 C/C C/C T C T/T T/T T/T
16232282 T/T T/T T A A/A A/A A/A

我正在尝试运行马尔可夫模型。

下面是我的代码:

import pandas as pd
import itertools as it

mcve_data = pd.read_csv('mcve_01.txt', sep='\t')

mcve_data.set_index(['pos'], inplace = True)

mcve_list = mcve_data.applymap(lambda c:[list(c)])

注意:我必须将每列中的值转换为列表,以便我可以根据条件运行所需的 itertools.product 或 zip。

def mapfun(c):
cstr = ''.join(map(str, c))
if '.' in cstr:
return '.'

if '/' in cstr:
sep = '/'
fun = it.product

else:
sep = '|'
fun = zip

return ','.join('g'.join(t) for t in fun(*c) if sep not in t)

现在(下),应用该函数进行马尔可夫建模。

mcve_mm = (mcve_list+mcve_list.shift(1)).dropna(how='all').\
applymap(mapfun)

注意:所以,在上面的代码中(mcve_list+mcve_list.shift(1))从同一列的两行读取值以应用马尔可夫链。

print(mcve_mm)

pd.DataFrame.to_csv(mcve_mm, 'mcve_mm.txt', sep='\t', index=True)

输出(mcve_mm.txt)是:

    pos     M1          M2          F1_x    F1_y    Sk1             S2              Sj
16230491 CgG,CgG,CgG,CgG CgG,CgG,CgG,CgG CgG TgT TgT,TgT,TgT,TgT . TgT,TgT,TgT,TgT
16230503 TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC TgC TgT TgT,TgT,TgT,TgT . TgT,TgT,TgT,TgT
16230524 TgT,TgT,TgT,TgT TgT,TgT,TgT,TgT TgT AgT AgT,AgT,AgT,AgT . AgT,AgT,AgT,AgT
16230535 . . TgT CgA . . .
16232072 . . AgT GgC . . .
16232072 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA AgA GgG GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG
16229783 CgA,CgA,CgA,CgA CgA,CgA,CgA,CgA GgA CgG GgG,GgG,CgG,CgG GgG,GgG,CgG,CgG CgG,CgG,|gG,|gG,GgG,GgG
16229992 AgC,AgC,AgC,AgC AgC,AgC,AgC,AgC GgG AgC AgG,AgC,AgG,AgC AgG,AgC,AgG,AgC AgC,GgG
16230007 TgA,TgA,TgA,TgA TgA,TgA,TgA,TgA AgG TgA AgA,AgA,|gA,|gA,TgA,TgA AgA,AgA,|gA,|gA,TgA,TgA AgA,TgG
16230011 GgT,GgT,GgT,GgT GgT,GgT,GgT,GgT CgA GgT CgA,GgT CgA,GgT GgA,Gg|,GgT,CgA,Cg|,CgT
16230049 AgG,AgG,AgG,AgG AgG,AgG,AgG,AgG TgC AgG . AgC,Ag|,AgG,TgC,Tg|,TgG AgG,AgC,TgG,TgC
16230174 . . TgT CgA . TgA,TgT,|gA,|gT,CgA,CgT CgA,CgT,|gA,|gT,TgA,TgT
16230190 . . TgT AgC GgT,TgC TgT,GgC TgC,GgT
16230260 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA GgT AgA GgG,Gg|,GgT,GgG,Gg|,GgT GgT,Gg|,GgG,GgT,Gg|,GgG GgT,Gg|,GgG,GgT,Gg|,GgG
16230260 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA GgG AgA GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG GgG,GgG,GgG,GgG
16232772 AgA,AgA,AgA,AgA AgA,AgA,AgA,AgA CgG AgA CgG,CgG,CgG,CgG CgG,CgG,CgG,CgG CgG,CgG,CgG,CgG
16232793 CgA,CgA,CgA,CgA CgA,CgA,CgA,CgA TgC CgA TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC
16232793 CgC,CgC,CgC,CgC CgC,CgC,CgC,CgC TgT CgC TgT,TgT,TgT,TgT TgT,TgT,TgT,TgT TgT,TgT,TgT,TgT
16232282 TgC,TgC,TgC,TgC TgC,TgC,TgC,TgC TgT AgC AgT,AgT,AgT,AgT AgT,AgT,AgT,AgT AgT,AgT,AgT,AgT

因此,输出文件中有几个时髦的输出。 类似于 GgG,Gg|,GgT,GgG,Gg|,GgT 的内容在 16230260 行

我正在努力摆脱这类问题。

问题在于代码:

    if '/' in cstr:
sep = '/'
fun = it.product

当 c(列表)是这样的:

    if '/' in cstr:
print(c)
print(type(c))
sep = '/'
fun = it.product

一些 c(由于移位而从两行读取)具有以下结构我认为这是问题所在

[['C', '|', 'G'], ['G', '/', 'G']]

<class 'list'>

因此,it.product 将竖线 (|) 与另一个列表中的剩余元素相乘。

它尝试过:

if '/' in cstr:
for x in c:
while '|' in x:
x.remove('|')

# but I think this is not updating c but sometimes affecting the c in other columns by borrowing the condition met from previous line.

sep = '/'
fun = it.product

我也试过:

    for x in c:
while '|' in x:
c == list(''.join(x).strip('|') for x in c)

将列表转换为字符串,然后去除管道(|),然后将其转换回列表,但遇到错误。

那么,问题是:如果在 c 中运行它时如何删除管道 (|)。product for lines/c like:

[['C', '|', 'G'], ['G', '/', 'G']]

<class 'list'>

以下类型的 c 的预期输出:

[['C', '|', 'G'], ['G', '/', 'G']][['C', '/', 'G'], ['G', '/', 'G']]

是一样的:CgG, CgG, GgG, GgG

最佳答案

我建议按如下方式更改函数:

from itertools import product
from functools import partial

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

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

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

print(mapfun([['C', '|', 'G'], ['G', '|', 'G']]))
print(mapfun([['C', '/', 'G'], ['G', '/', 'G']]))
print(mapfun([['C', '|', 'G'], ['G', '/', 'G']]))
print(mapfun([['C', '/', 'G'], ['G', '|', 'G']]))

这会产生输出:

CgG,GgG
CgG,CgG,GgG,GgG
CgG,CgG,GgG,GgG
CgG,CgG,GgG,GgG

zip 用于第一个示例,itertools.product 用于所有后续示例。

解释:

  • 要确定任何条件(“.”出现在任何参数中或“|”出现在所有参数中)是否为真,使用列表推导式:例如 ['.' in l for l in c] 是一个 bool 值列表,当且仅当相应的参数包含一个点时,这些 bool 值才为真。然后 any 用于检查是否有任何参数包含“.”。
  • 变量 filt 是在 mapfun 之外定义的,这样它就不必在每次调用 mapfun 时重新计算 - 注意污染 namespace ,它被添加为函数对象的一个​​属性(参见 What is the Python equivalent of static variables inside a function? )
  • 请注意 partial(filter, f)lambda x: filter(f,x) 相同
  • partial 中的 lambda 仅检查元素是否在 filt_set 中,因此应将其删除
  • *map(mapfun.filt,c) 简单地使用 mapfun.filt 过滤所有参数,然后将它们作为参数传递给所选函数 f

关于python - 如何通过删除列表中的特定元素来为给定列表运行 itertools 产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42146437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com