我有一个数据框,例如:
df = ID aa_len aa_seq \
0 001 45 [M, R, S, R, Y, P, L, L, R, G, E, A, V, A, V, ...
1 002 45 [M, R, S, R, Y, P, L, L, R, G, E, A, V, A, V, ...
mut_position
0 [-1]
1 [5, 94, 95, 132]
“ mut_position”可以是-1或其他非负数(2,3,4)或一些数字的列表。 例如它可以是001中的-1。像002中那样的少数列表或一个数字-例如4。 我需要计算没有-1的主题的数量。
我试图通过与-1进行比较,并收集r不同但似乎起作用的值...
def count_mutations(df, ref_aa_len):
nomis = -1
mutation = (df['mut_position']) != nomis
print (mutation)
我对两者的理解都为真(忽略ref_aa_len,应该稍后再发布)-
0 True
1 True
答案 0 :(得分:1)
我认为需要list compehension
和生成器以及布尔值True
s的总和:
df['non_negative'] = [sum(y != -1 for y in x) for x in df['mut_position']]
print (df)
mut_position non_negative
0 [-1] 0
1 [5, 94, 95, 132] 4
如果可能,也可以使用标量:
print (df)
mut_position
0 [-1]
1 [5,94,95,132]
2 6
3 -1
df['non_negative'] = [sum(y != -1 for y in x)
if isinstance(x, list)
else int(x != -1) for x in df['mut_position']]
print (df)
mut_position non_negative
0 [-1] 0
1 [5, 94, 95, 132] 4
2 6 1
3 -1 0
如果需要检查-1
的列表中的第一个值,并按boolean indexing
进行过滤:
df = pd.DataFrame({'mut_position':[[-1], [5,94,95,132],[2,-1], [-1]]})
print (df)
mut_position
0 [-1]
1 [5, 94, 95, 132]
2 [2, -1]
3 [-1]
df1 = df[df['mut_position'].str[0] != -1 ]
print (df1)
mut_position
1 [5, 94, 95, 132]
2 [2, -1]
详细信息:
str[0]
用于选择字符串的第一个字符或可迭代的第一个值:
print (df['mut_position'].str[0])
0 -1
1 5
2 2
3 -1
Name: mut_position, dtype: int64
对于-1
的任何位置,请使用all
:
df1 = df[[all(y != -1 for y in x) for x in df['mut_position']]]
print (df1)
mut_position
1 [5, 94, 95, 132]
列表理解返回boolena列表:
print ([all(y != -1 for y in x) for x in df['mut_position']])
[False, True, False, False]