前言:
最近幫某三甲醫院做了一些醫學資料處理的程式
記錄一下
一 病人樣本去重
需要:第三列**病人的編號,第一列**病人的資料型別
統計的時候,出現同乙個病人有不同的資料型別,按照一定的優先級別,
只保留一類。
sample
os_patient
os.time
mmrf_2226_1_pb_whole
0mmrf_2226
1mmrf_2226_1_bm_cd138pos
0mmrf_2226
1mmrf_2187_1_pb_cd138pos
0mmrf_2187
1
# -*- coding: utf-8 -*-
"""created on mon jul 20 14:10:43 2020
@author: chengxf2
去掉內容重複的
"""import os
from openpyxl import load_workbook
import numpy as np
from xlrd import open_workbook
import csv
import sys
class removerep:
"""獲取當前目錄下面的xls
args
none
return
path: 檔案路徑
"""def getpath(self):
root = os.getcwd()
files = os.listdir(root)
for file in files:
pos = file.find("xls")
if pos>1:
path = os.path.abspath(file)
filename = os.path.splitext(file)[0]
print("\n path ",path)
return path,filename
def __init__(self):
self.m = 0
self.n = 0
self.dictitem ={} #**裡面的所有內容
self.keylist =
"""獲得優先級別
args
tag1: cd138pos,whole,wbc
tag2: pb, bm
return
pri:優先級別,3 最高
"""def getpre(self, tag1, tag2):
# print("\n tag1 ",tag1,"\t tg2 ",tag2)
pri = -1
if tag1 =="cd138pos" and tag2 == "bm":
pri = 3
elif tag1 =="cd138pos" and tag2 =="pb":
pri = 2
else:
pri = 1
return pri
"""同乙個病人,有重複的資料,只儲存一種
[['cd138pos', 'pb', 3], ['cd3pos', 'pb', 4], ['cd138pos', 'bm', 5]]
args
items: 重複的列表項
return
maxindex: 選擇最優的
"""def getindex(self, items):
maxpri = -1 #最優級別的index
maxindex = -1 #最優級別的index
for item in items:
tag1 = item[0]
tag2 = item[1]
index = item[2]
pri = self.getpre(tag1, tag2)
# print("\n ","tag1",tag1,"\t tag2 ",tag2, "\t 優先級別: ",pri,"\t index ",index)
if pri>maxpri:
maxpri = pri
maxindex = index
# print("\n maxindex:",maxindex)
return maxindex
"""去除重複的
args
rows: 行
head: 頭
return
retrow: 去重後的列表
"""def merge(self, rows,head):
retrow =
index = #需要新增的列表
#print("head ",head)
for key in self.dictitem.keys(): #只留乙個
items = self.dictitem[key]
if len(items)>1: #有重複的
#print("++++++key +++++",key)
index = self.getindex(items) #多個只預留乙個
# print("item: ",rows[index])
else:
#print("\n item ",item[0][2])
index = items[0][2]
#print(index)
for key in index:
item = rows[key]
#print("\n 刪除後的**: \n ",retrow)
return retrow
"""讀取xls
args
path:
**路徑
cd138pos 排在第一優先順序
[bm,cd]
return
rows : **內容
head: **頭
"""def readxls(self,path):
rows =
workbook = open_workbook(path) # 開啟xls檔案
sh = workbook.sheet_by_index(0)
nrows = sh.nrows
ncols = sh.ncols
# print("sheets ",nrows,"\t ncols : ",ncols)
#獲取第一行,第一列資料
#whead = sh.cell_value(1,1)
head = sh.row_values(0) #從0 開始的
for i in range(1,nrows): #第一行不讀,為頭
row_data = sh.row_values(i)
#print("\n row_data ",row_data)
sample = row_data[0].split("_")
tag1 = sample[4]#cd138pos
tag2 = sample[3]#pb,bm
index = i-1 #頭不讀,所以減去1
patient = row_data[2] #病人標號
if patient not in self.dictitem.keys():
self.dictitem[patient]=[[tag1,tag2,index]]
else: #已經存在了
curitem = self.dictitem[patient] #當前列表
newitem = [tag1,tag2,index] #新的條目
self.dictitem[patient] = curitem
return rows,head
"""儲存到csv檔案裡面
arghead: **第一行 #head = ['標題列1', '標題列2']
rows: **內容 #rows = [['張三', 80],['李四', 90]]
return
rows: 檔案裡面的資料內容
head: [id,檔名]
"""def writecsv(self,rows, name):
print("\n *****儲存檔案 ********\n ") #4,60483
filename = name+".csv"
f= open(filename,'w', newline='')
# print("\n rows, ",rows)
writer = csv.writer(f)
writer.writerows(rows)
f.close()
print("\n *****儲存退出 ********\n ") #4,60483
""""""
def remove(self):
path,name = self.getpath()
print("\n 讀取** \n ")
xmlrows,head = self.readxls(path)
print("\n 合併** \n ")
rows = self.merge(xmlrows,head)
self.writecsv(rows,name)
move = removerep()
move.remove()
python 資料處理 1
python 基礎 各種資料型別的用途 1.字串 1 大小寫轉換 例 pharse he is very beautiful print pharse.upper other djfsdf print other.lower 以上 並沒有將變數永久改為大 小寫模式,若想永久改變 pharse he ...
Python 資料處理(1)
記錄最近處理資料集常用的幾個操作。刪除行之後行號就不是連續的了,索引行號的時候不方便。這裡重新設定行號,並把原先的行號drop掉。df df.reset index drop true 統計,排序。df.colnames.value counts sort index loc 引用行列名稱。str....
ORACLE資料處理要點1
縮小資料處理範圍 分割槽表定時資料爬取 縮小表資料 分時段 多執行緒處理 走索引避免重複資料插入可以用唯一鍵插入異常處理 insert into tb a exception when dup val on index then null when others then return 乙個幾億的表...