Невозможно извлечь правильные столбцы из кадра данных pandas - PullRequest
0 голосов
/ 31 декабря 2018

Я создаю сценарий для редактирования выравниваний последовательностей ДНК путем отслеживания ошибок из набора тестовых данных.Моя цель - отслеживать столбцы, которые содержат стоп-кодоны ниже и выше определенного порога.Например, если столбец (содержит 3 основания или кодон) содержит «TAA», «TGA» или «TAG» и если более 40% образцов содержат один из этих стоп-кодонов в столбце, я хочу сохранитьзапись об этом в отдельном файле Excel (который я могу создать), поскольку эти столбцы будут удалены.Если менее 40% выборок содержат стоп-кодон в столбце, я отслеживаю его отдельно, так как его нужно будет отредактировать.

Мой кадр данных выглядит примерно так (я добавил "/" здесь, чтобы показатькодоны здесь легче):

    1    2  3    4 ... 1000
S1 TAA/TAA/TGA/CCC/.../TGA
S2 ATG/-AT/TAG/---/.../TGA
S3 ATG/TAA/-CC/--T/.../TAA
S4 ATG/TAA/GTA/CCC/.../TAA
S5 ATG/-AT/---/---/.../TAG
S6 ATG/TAA/-CC/--T/.../TAG
S7 ATG/TAA/GTA/CCC/.../CCC
S8 ATG/-AT/---/---/.../CCC
S9 ATG/TAA/-CC/--T/.../CCC
S10 ATG/TAA/-CC/--T/.../CCC

Я могу легко извлечь столбцы с пробелами (содержащие «---»), и мне удалось отследить столбцы со стоп-кодонами более 40%, но я не могу отследитьстолбцы, которые содержат менее 40%, и это потому, что он проходит по каждому из 3 кодонов в отдельности.Например, если у меня есть 10 выборок, если менее 4 выборок в столбце 1 содержат «TAA» или «TGA» или «TAG» (в любом комбо), я бы сохранил эту запись и изменил бы стоп-кодоны на «---"в окончательно отредактированном фрейме данных.Но когда каждый из стоп-кодонов появляется менее чем в 4 раза каждый, мой сценарий обрабатывает их по отдельности и показывает мне столбцы с более чем 40% остановками в нем, потому что я не могу понять, как сделать его суммированным по всем трем кодонам и рассматривать его каквсего.

df # (loaded earlier from a large script)
df_track = pd.DataFrame() # make new df to track less than 40% stop codons in columns
codon = ["TAA","TGA","TAG"]
def track_lessthan40(df, codon, 0.4):
    num_rows = len(df)
    change = [col for col in df.columns \
        if sum(df[col] == codon[0]) > 0 or sum(df[col] == codon[1]) > 0 \
        or sum(df[col] == codon[2]) > 0 \
        and sum(df[col] == codon[0]) \
        and sum(df[col] == codon[1]) \
        and sum(df[col] == codon[2]) < round(num_rows*0.4, 2)]

df_change = df[change]
print(df_change)

Что я ожидаю:

df_change

    1  3
S1 TAA/TGA
S2 ATG/TAG
S3 ATG/-CC
S4 ATG/GTA
S5 ATG/---
S6 ATG/-CC
S7 ATG/GTA
S8 ATG/---
S9 ATG/-CC
S10 ATG/-CC

Что я получу.

    1  3  ... 1000
S1 TAA/TGA/.../TGA
S2 ATG/TAG/.../TGA
S3 ATG/-CC/.../TAA
S4 ATG/GTA/.../TAA
S5 ATG/---/.../TAG
S6 ATG/-CC/.../TAG
S7 ATG/GTA/.../CCC
S8 ATG/---/.../CCC
S9 ATG/-CC/.../CCC
S10 ATG/-CC/.../CCC

Последний столбец отображается, но не должен.Его следует отслеживать в моем другом сценарии, только если я хочу, чтобы столбцы, в которых стоп-кодоны присутствовали в более чем 40% выборок.Есть идеи, как это сделать?Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Похоже, что может быть разница между составом вашего примера кода и df, который вы используете.Немного скорректированный пример Джона и мой сценарий работают для вашего образца (см. Изображение).

enter image description here

# my clunky example
import pandas as pd
csv = '/Users/<USER>/PycharmProjects/stackoverflow/gattaka.text'

df = pd.read_table(csv, sep='/')

df_track = pd.DataFrame()  # make new df to track less than 40% stop codons in columns
codon = ["TAA", "TGA", "TAG"]

for column in df.columns:
    col_length = len(df[column])
    col_list = df[column].tolist()

    sum_stopper = 0
    for gene in col_list:
        if gene in codon:
            sum_stopper += 1

    if sum_stopper == 0:
        break

    elif sum_stopper <= (0.4 * col_length):
        col_series = pd.Series(col_list, name=column)
        df_track[column] = col_series

print(df_track)
print('------')

# Jon's adjusted, pretty, concise and pythonic example
df_track = df.loc[:, (df.isin(codon).sum()/len(df) <= 0.4) & (df.isin(codon).sum() > 0)]
0 голосов
/ 31 декабря 2018

IIUC df.isin(codon).sum()/len(df) <= 0.4 выводит

#    1       True
#  2        False
# 3          True
#   4        True
# 1000      False

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

df.loc[:, df.isin(codon).sum()/len(df) <= 0.4]

, используя pd.isin, чтобы проверить, есть ли одинстоп-кодонов находится в столбцах, суммируя, чтобы подсчитать, сколько раз оно истинно, и разделив его на длину кадра данных, чтобы получить его в процентах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...