Проблема цикла добавления столбца Pandas Dataframe

Я создал программу, которая создает 100 вариантов из исходной последовательности. Основная цель этой программы - создать 100 вариантов последовательности ДНК, содержащей 100 нуклеотидов. Для создания вариантов у нас есть исходная последовательность (у которой есть клон для дальнейшей модификации). и случайное количество мутаций (от 1 до 5) сохраняется в исходной последовательности. Например, если исходная нить 1,2,3,4, вариант может быть 1,3,3,4 или 1,4,2,3; вы поняли суть. Я также добавил структуру if-elif, которая отключает мутированный нуклеотид, чтобы он был таким же, как исходный. Я предполагаю, что у вас есть некоторые базовые знания о ДНК, поэтому я не буду чрезмерно объяснять. Но с радостью отвечу на вопросы, если они будут.

Я хочу сделать 100 вариантов этого и поместить каждую последовательность вариантов в отдельный столбец фрейма данных pandas. Моя проблема в том, что программа создает один вариант, а остальные 99 вариантов совпадают с этим. Я не мог понять почему. Если вы можете посоветовать некоторые модификации кода, чтобы избежать повторения, я был бы признателен. Ниже приведен код и результат выполнения кода.

Код:

import pandas
import random
import pandas as pd


someshit = [4, 4, 2, 4, 4, 1, 3, 2, 1, 1, 2, 3, 4, 3, 3, 4, 1, 3, 4, 4, 3, 2, 4, 4, 
        4, 3, 3, 1, 3, 1, 4, 1, 3, 4, 2, 4, 2, 3, 3, 3, 1, 2, 1, 3, 2, 3, 2, 4, 
        4, 3, 4, 4, 4, 3, 2, 1, 4, 3, 4, 4, 2, 2, 2, 1, 2, 2, 1, 1, 4, 2, 1, 4, 3,
        3, 2, 4, 4, 1, 1, 2, 1, 4, 1, 4, 4, 3, 3, 1, 3, 2, 3, 3, 1, 4, 1, 2, 2, 3, 2, 4]  
r = 0
nucs = [1,2,3,4]
list2 = []
list3 = []
i = 0
j = 0
n = len(someshit)   #LENGTH OF THE SEQUENCE
 #RANDOM MUTATION COUNT

result = None
df = pd.DataFrame({ 0 : someshit })   
    
shitass = someshit #shitass = someshit clone
onehundo = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
            38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,
            73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]
hundred = onehundo #hundred  = onehundo clone
while i < 99:
    x = random.randint(1,5) #RANDOM MUTATION COUNT
    while j < x:
        y = random.choice(hundred)
    
        if shitass[y] == 4:
            nucs.remove(4)
            z = random.choice(nucs)  #z = the new mutated nucleotide
            shitass[y] = z

        elif shitass[y] == 3:
            nucs.remove(3)
            z = random.choice(nucs)  #z = the new mutated nucleotide
            shitass[y] = z

        elif shitass[y] == 2:
            nucs.remove(2)
            z = random.choice(nucs)  #z = the new mutated nucleotide
            shitass[y] = z

        elif shitass[y] == 1:
            nucs.remove(1)
            z = random.choice(nucs)  #z = the new mutated nucleotide
            shitass[y] = z

        nucs = [1,2,3,4] #re-establishes the nucs after every mutation.

        list2.append(y)
        list3.append(z)
        hundred.remove(y)
        #------------------------------------#------------------------------------#------------------------------------
        j = j+1
        
    for r in range(100):
        r = r+1
        result = shitass
        df[r] = result
        hundred = onehundo #re-establishment of the clone
        shitass = someshit #re-establishment of the clone
        r = r+1
        
    i = i+1

    

    
    
print(x)
print(y)
print(list2)
print(list3)
print(shitass)
print(df)

Код действительно запутанный, заранее извините. И вот что у меня получилось:

2
62
[31, 82, 60, 3, 62]
[4, 3, 1, 1, 1]
[4, 4, 2, 1, 4, 1, 3, 2, 1, 1, 2, 3, 4, 3, 3, 4, 1, 3, 4, 4, 3, 2, 4, 4, 4, 3, 3, 1, 3, 1, 4, 4, 3, 4, 2, 4, 2, 3, 3, 3, 1, 2, 1, 3, 2, 3, 2, 4, 4, 3, 4, 4, 4, 3, 2, 1, 4, 3, 4, 4, 1, 2, 1, 1, 2, 2, 1, 1, 4, 2, 1, 4, 3, 3, 2, 4, 4, 1, 1, 2, 1, 4, 3, 4, 4, 3, 3, 1, 3, 2, 3, 3, 1, 4, 1, 2, 2, 3, 2, 4]
    0    1    2    3    4    5    6    7    8    9    ...  91   92   93   94   \
0     4    4    4    4    4    4    4    4    4    4  ...    4    4    4    4   
1     4    4    4    4    4    4    4    4    4    4  ...    4    4    4    4   
2     2    2    2    2    2    2    2    2    2    2  ...    2    2    2    2   
3     4    1    1    1    1    1    1    1    1    1  ...    1    1    1    1   
4     4    4    4    4    4    4    4    4    4    4  ...    4    4    4    4   
..  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...  ...   
95    2    2    2    2    2    2    2    2    2    2  ...    2    2    2    2   
96    2    2    2    2    2    2    2    2    2    2  ...    2    2    2    2   
97    3    3    3    3    3    3    3    3    3    3  ...    3    3    3    3   
98    2    2    2    2    2    2    2    2    2    2  ...    2    2    2    2   
99    4    4    4    4    4    4    4    4    4    4  ...    4    4    4    4   

    95   96   97   98   99   100  
0     4    4    4    4    4    4  
1     4    4    4    4    4    4  
2     2    2    2    2    2    2  
3     1    1    1    1    1    1  
4     4    4    4    4    4    4  
..  ...  ...  ...  ...  ...  ...  
95    2    2    2    2    2    2  
96    2    2    2    2    2    2  
97    3    3    3    3    3    3  
98    2    2    2    2    2    2  
99    4    4    4    4    4    4  

[100 rows x 101 columns]

Я бы посоветовал вам переименовать свои переменные

tomjn 30.03.2021 18:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
36
1

Ответы 1

Одна из ваших проблем связана с оператором shitass = someshit #shitass = someshit clone. Этот оператор не создает копию или клон, как вы, кажется, ожидаете. Следующее - иллюстрация того, что я имею в виду.

la = [1,2,3,1,4,5,6]
lb = la

В:

print(f"LA = {la}\nLB= {lb}") 

Урожайность:

LA = [1, 2, 3, 1, 4, 5, 6]
LB= [1, 2, 3, 1, 4, 5, 6] 

Теперь, если вы измените содержимое lb следующим образом:

lb[2] = 9

и повторите предыдущий оператор печати, вы увидите, что и la, и lb имеют одинаковые значения, потому что lb = la просто присваивает второе имя одному и тому же объекту в python. Это показано ниже:

lb[2] = 9
print(f"LA = {la}\nLB= {lb}")

Урожайность:

LA = [1, 2, 9, 1, 4, 5, 6]
LB= [1, 2, 9, 1, 4, 5, 6]

Чтобы сделать lb клоном la и поддерживать независимые изменения, вы должны использовать функцию копирования следующим образом:

lc = la.copy()
lc[2] = 9
print(f"LA = {la}\nLC= {lc}")

Который дает:

LA = [1, 2, 3, 1, 4, 5, 6]
LC= [1, 2, 9, 1, 4, 5, 6]

Другие вопросы по теме