是否有一种pythonic方法可以合并用于csv操作的重复命令?
输出工作,它做了我需要做的事情,但是有没有一种更像python的方法呢? 我基本上是在尝试通过csv进行过滤,找到每个患者的全部独特元素 我必须以这种特定的方式编写代码,以确保数据正确对齐,而不会丢失格式。我只是想知道有没有更像蟒蛇的方法?我甚至会使用资源而不是代码。我只是想提高效率。我仍然是一名python新手,并且由于我只能使用导入csv、os和字符串而受到限制。是否有一种pythonic方法可以合并用于csv操作的重复命令?,python,csv,dictionary,repeat,Python,Csv,Dictionary,Repeat,输出工作,它做了我需要做的事情,但是有没有一种更像python的方法呢? 我基本上是在尝试通过csv进行过滤,找到每个患者的全部独特元素 我必须以这种特定的方式编写代码,以确保数据正确对齐,而不会丢失格式。我只是想知道有没有更像蟒蛇的方法?我甚至会使用资源而不是代码。我只是想提高效率。我仍然是一名python新手,并且由于我只能使用导入csv、os和字符串而受到限制。 我的行从第5行到第15行开始的原因是我不需要第1-4列中的任何内容 我的代码如下: diagnosiscoun
我的行从第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
对我来说,这不是一个好的代码结构,我想把它做得更好。你可以列出你想要操作的对象,然后遍历该列表并执行操作。例如:
cd_list=[list()表示范围(10)内的_]
指数=[0,5,6,7,8,9,10,11,12,13]
测试={}
diag={}
hjj={}
对于诊断中的行:
对于索引,zip中的cd_obj(索引,cd_列表):
cd_对象附加(行[索引])
dg_list=list(映射(lambda cd_obj:tuple(patID,cd_obj,cd_list))
对于dg_清单中的dg_obj:
对于dg_obj中的k,v:
test.setdefault(k,[]).append(v)
如果没有直接测试的对象,这应该是可行的,但我不能确定
注意:一般情况下,如果你发现自己重复一次或两次以上的动作,你的<强>第一条/强>本能应该考虑如何使用循环来更有效地完成它。 我认为你所寻找的是一种更优雅的组合组合方式。 也许是这样或这样的组合:
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:]
根据需要在enumerate下添加更多列。!谢谢你帮助我!我真的在为循环工作,但在使用循环时遇到了一些问题。不幸的是,我也不能在我的函数中使用lambda。我可以帮助您解决
lambda
的具体问题吗@VSI无法使用lambda。lambda没有问题,对于分配,我根本不能使用lambda。任何lambda
函数都可以被命名函数替换,所以这应该不是什么大问题-如果您有任何问题,请告诉我!