Python - Кодировка Genomi c Данные в кадре данных - PullRequest
3 голосов
/ 09 февраля 2020

Привет. Я пытаюсь закодировать Genome, хранящийся в виде строки внутри кадра данных, считанного из CSV.

Сейчас я пытаюсь разбить каждую строку в кадре данных под столбцом «Геном» на список его базовых пар, т.е. от ('acgt ...') до ('a', 'c ',' g ',' t '...) затем конвертируйте каждую базовую пару в число с плавающей запятой (0,25,0.50,0,75,1,00) соответственно.

Мне показалось, что я искал функцию разделения для разделения каждой строки на символы, но ни одна из них не работает с данными в кадре данных даже при преобразовании в строку с использованием .tostring

Вот мой самый недавний код:

import re
import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder


def string_to_array(my_string):
    my_string = my_string.lower()
    my_string = re.sub('[^acgt]', 'z', my_string)
    my_array = np.array(list(my_string))
    return my_array

label_encoder = LabelEncoder()
label_encoder.fit(np.array(['a','g','c','t','z']))

def ordinal_encoder(my_array):
    integer_encoded = label_encoder.transform(my_array)
    float_encoded = integer_encoded.astype(float)
    float_encoded[float_encoded == 0] = 0.25  # A
    float_encoded[float_encoded == 1] = 0.50  # C
    float_encoded[float_encoded == 2] = 0.75  # G
    float_encoded[float_encoded == 3] = 1.00  # T
    float_encoded[float_encoded == 4] = 0.00  # anything else, z
    return float_encoded



dfpath = 'C:\\Users\\CAAVR\\Desktop\\Ison.csv'
dataframe = pd.read_csv(dfpath)

df = ordinal_encoder(string_to_array(dataframe[['Genome']].values.tostring()))
print(df)

Я пытался создать свою собственную функцию, но понятия не имею, как они работают. Все, что я пробую, указывает на невозможность обработки данных, когда они находятся в массиве numpy, и ничто не работает для преобразования данных в другой тип.

Спасибо за советы!

Редактировать: Вот распечатка фрейма данных-

 Antibiotic  ...                                             Genome
0       isoniazid  ...  ccctgacacatcacggcgcctgaccgacgagcagaagatccagctc...
1       isoniazid  ...  gggggtgctggcggggccggcgccgataaccccaccggcatcggcg...
2       isoniazid  ...  aatcacaccccgcgcgattgctagcatcctcggacacactgcacgc...
3       isoniazid  ...  gttgttgttgccgagattcgcaatgcccaggttgttgttgccgaga...
4       isoniazid  ...  ttgaccgatgaccccggttcaggcttcaccacagtgtggaacgcgg...

В 5-м списке 5 столбцов «Геном» я не знаю, почему 1. .head() не будет работать и 2. почему print() не дает мне все столбцы ...

1 Ответ

1 голос
/ 09 февраля 2020

Я не думаю, что LabelEncoder - это то, что вы хотите. Это простое преобразование, я рекомендую сделать это напрямую. Начните с поиска сопоставления вашей базовой пары:

lookup = {
  'a': 0.25,
  'g': 0.50,
  'c': 0.75,
  't': 1.00
  # z: 0.00
}

Затем примените поиск к значению столбца «Геном». Атрибут values вернет результирующий кадр данных в виде ndarray.

dataframe['Genome'].apply(lambda bps: pd.Series([lookup[bp] if bp in lookup else 0.0 for bp in bps.lower()])).values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...