有没有一种pythonic的方法可以合并用于csv操作的重复命令?

时间:2020-10-22 02:29:57

标签: python csv dictionary repeat

输出有效,它可以完成我需要做的事情,但是还有更多的pythonic方式可以做到这一点吗? 我基本上是在尝试通过csv过滤并找到每个患者的唯一元素。

我必须以特定方式编写代码,以确保我的数据正确对齐而不会丢失格式。我只是想知道是否还有一种更Python化的方式来做到这一点?我什至会占用资源而不是代码。我只是想提高效率。我仍然是python新手,并且由于只能使用import csv,os和string的事实而受到限制。
我的行从第5行到第15行开始的原因是,对于该部分,我不需要1-4列中的任何内容。

我的代码如下:


        diagnosiscounts = csv.reader(self.unique_diagnosis)
        patID = []
        cd1 = []
        cd2 = []
        cd3 = []
        cd4 = []
        cd5 = []
        cd6 = []
        cd7 = []
        cd8 = []
        cd9 = []
        

        test = {}
        diag = {}
        hjj = {}
        for row in diagnosiscounts:
            patID.append(row[0])
            cd1.append(row[5])
            cd2.append(row[6])
            cd3.append(row[7])
            cd4.append(row[8])
            cd5.append(row[9])
            cd6.append(row[10])
            cd7.append(row[11])
            cd8.append(row[12])
            cd9.append(row[13])
            
        
        dg1 = tuple(zip(patID,cd1))
        dg2 = tuple(zip(patID,cd2))
        dg3 = tuple(zip(patID,cd3))
        dg4 = tuple(zip(patID,cd4))
        dg5 = tuple(zip(patID,cd5))
        dg6 = tuple(zip(patID,cd6))
        dg7 = tuple(zip(patID,cd7))
        dg8 = tuple(zip(patID,cd8))
        dg9 = tuple(zip(patID,cd9))
        

        for k, v in dg1:
            test.setdefault(k,[]).append(v)
        for k, v in dg2:
            test.setdefault(k,[]).append(v)
        for k, v in dg3:
            test.setdefault(k,[]).append(v)
        for k, v in dg4:
            test.setdefault(k,[]).append(v)
        for k, v in dg5:
            test.setdefault(k,[]).append(v)
        for k, v in dg6:
            test.setdefault(k,[]).append(v)
        for k, v in dg7:
            test.setdefault(k,[]).append(v)
        for k, v in dg8:
            test.setdefault(k,[]).append(v)
        for k, v in dg9:
            test.setdefault(k,[]).append(v)
        
        
        for k, v in test.items():
            tp = []
            for i in v:
                if i != '':
                    tp.append(i)
            diag[k] = set(tp)
        
        for k,v in diag.items():
            hjj[k] = len(v)

        print(hjj)

我的csv文件的结构如下:

Patient_ID      ICD9_DGNS_CD_1  ICD9_DGNS_CD_2  ICD9_DGNS_CD_3  ICD9_DGNS_CD_4  ICD9_DGNS_CD_5 ICD9_DGNS_CD_6   ICD9_DGNS_CD_7  ICD9_DGNS_CD_8  ICD9_DGNS_CD_9  ICD9_DGNS_CD_10
00013D2EFD8E45D1    5.42192E+14 4824842417          V5841                                   
00016F745862898F    5.42272E+14 2963419753         2963419753   V5832              V5861    2724    3182    V5869   42731               
00016F745862898F    5.42282E+14 5737807753         5737807753   9594               E9174    4019                            
0001FDD721E223DC    5.42642E+14 1233847710          78943          V5866           V1272                            
00024B3D2352D2D0    5.42242E+14 9688809345          6009                                    
00024B3D2352D2D0    5.42442E+14 4199631965          6115                                    
00024B3D2352D2D0    5.42422E+14 1449018601          2723                                    
00024B3D2352D2D0    5.42372E+14 5972737463          V821                                    
0002F28CE057345B    5.42052E+14                                                                                546645             3255             4566                     45974
0002F28CE057345B    5.42162E+14 7985077191          7902                                    
0002F28CE057345B    5.42192E+14 420175516           7232                                    
0002F28CE057345B    5.42342E+14 7535793863          25012          V5867                                
0002F28CE057345B    5.42472E+14 6022067668          59781                                   
0002F28CE057345B    5.42892E+14                     3482            3569    3320        

对我来说,这不是很好的代码结构,我想使其更好。

2 个答案:

答案 0 :(得分:0)

您可以列出要操作的对象,然后遍历那个列表并执行操作。如:

cd_list = [list() for _ in range(10)]
indices = [0, 5, 6, 7, 8, 9, 10, 11, 12, 13]
test = {}
diag = {}
hjj = {}
for row in diagnosiscounts:
    for index, cd_obj in zip(indices, cd_list):
        cd_obj.append(row[index])

dg_list = list(map(lambda cd_obj: tuple(patID, cd_obj), cd_list))
for dg_obj in dg_list:
    for k, v in dg_obj:
        test.setdefault(k, []).append(v)

在没有可以直接测试的对象的情况下,此应该有效,但是我不确定。

注意:作为一般规则,如果发现重复动作不止一次或两次,您的第一本能应考虑如何使用循环更有效地完成操作

答案 1 :(得分:0)

我认为您正在寻找的是一种更优雅的组合方式。

也许是这样的东西或组合:

from collections import defaultdict

diagnosiscounts = [
    ('00013D2EFD8E45D1', '5.42192E+14', '4824842417'),
    ('00016F745862898F', '5.42272E+14', '2963419753'),
]

data = defaultdict(list)
data_by_patient = {}
for row in diagnosiscounts:
    for i, c in enumerate(('Patient_ID', 'ICD9_DGNS_CD_1', 'ICD9_DGNS_CD_2')):
        data[c].append(row[i])
        data_by_patient[row[0]] = row[1:]
相关问题