Я думаю, что нужно list compehension
с генератором и сумма логических True
с:
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]
Понимание списка возвращение списка булена:
print ([all(y != -1 for y in x) for x in df['mut_position']])
[False, True, False, False]