1. 程式人生 > >Python 篩選 替換 排序 提取(單個染色體SNP從全基因組提取)

Python 篩選 替換 排序 提取(單個染色體SNP從全基因組提取)

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 28 18:06:39 2018

@author: windows10
"""
import pandas as pd
#from pandas import DataFrame as df

#對ped鹼基形式替換為數字形式
f = open('C:\\Users\\windows10\\Desktop\\Python練習\\文字流\\all.ped')
data1 = pd.read_table(f,header = None) #header 預設為第一行
data1.shape  #展示資料框的  行數和列數,如果資料為1,則對sep重新設定進行調節
data1.head()
data11 = data1.iloc[:, 6:]
data11[data11.isnull().values == True]
data11 = data11.replace('A', 1)
data11 = data11.replace('T', 2)
data11 = data11.replace('C', 3)
data11 = data11.replace('G', 4)
print(data11)
data12 = pd.concat([data1.iloc[:, :6],data11],axis = 1)
print(data12)
data12.shape
data12.head(20)


#抽取map第一條染色體多行的SNP位點,並按照位置順序進行排列
f = open('C:\\Users\\windows10\\Desktop\\Python練習\\文字流\\all.map')
data2 = pd.read_table(f,names=['1', '2', '3', '4']) #header 預設為第一行
data2.shape  #展示資料框的  行數和列數,如果資料為1,則對sep重新設定進行調節
data2.head()
data2.iloc[:,1]  #map檔案的首列
data2.iloc[:,1].shape
print(type(data2))
data2.iloc[5,1]  
type(data2.iloc[5,1])   #確定元素型別


data2 = data2.astype('object')   #轉化元素型別為object類
print(data2['1'])
data21 = data2[data2['1'] == '8']  #‘1’為字串,加‘’,選取map檔案裡的所有2號染色體上的位點
data21.head()
data21.values
data21['1']
data21.index    #檢視行索引
data21.columns    #檢視列索引
data21.values    #檢視資料框的值
data21.dtypes    #檢視每列的資料型別
data21['4'].astype('int64')     #轉化第四列為數值型,才能排序
data22 = data21.sort_values(by = '4')   #by 後直接跟index
data22.shape
data22.head(500)
list = data22['2']
list = list.tolist()   #將第二列資料(第N條染色體上的SNP name)傳遞到列表
list

#為ped檔案建立col.name
li = []
for j in range(0,68516):    #把SNP位點列表轉化為ped的column名
    li.append(data2.iloc[j,1])
    li.append(data2.iloc[j,1])
print(li)
st = ['FMID', 'INID', 'FAID', 'MOID', 'SEX', 'H']  #為ped檔案建立前6列 表頭
st
lis = st + li  #前6列表頭和ped7::個表頭合併,建立完整的ped表頭
lis[:10]
len(lis)
#修改data12的列名
data12.columns = lis     #為ped檔案建立表頭
data12.head(20)
data12.shape



#對1號染色體多行的位點從ped 檔案中提取
#按照map檔案中1號染色體,排好序的SNP,逐個對list中SNP進行提取

data12['WUR10000127']
type(data12['WUR10000127'])
newdf = data12.iloc[:, :6]   #提取ped檔案表頭
newdf   

for k in list:            #從ped檔案裡提取第N條染色體上的SNP位點,並組成新的資料框
    newdf = pd.concat([newdf,data12[k]],axis = 1)   #Axis = 1代表逐列合併(按列合併)
newdf.columns
newdf.to_excel("C:\\Users\\windows10\\Desktop\\Python練習\\文字流\\chrom8_ped.xlsx", index = False, header = True)
data22.to_excel("C:\\Users\\windows10\\Desktop\\Python練習\\文字流\\chrom8_map.xlsx", index = False, header = True)



#      流程化操作需要修改的地方,如下:
###   42:  data2['1'] == 
###   87:  newdf.to_exce
###   88:  data22.to_excel