我能够使用xport模块(https://github.com/selik/xport)用Python编写xpt文件。所有数据都写得很好,并且被Pinnacle 21验证器接受。列名在那里,但标签丢失了。标签就像是该名称的字幕。我正在努力了解有关如何将标签添加到列名的说明。
我有一个带有数据的数据框。使用xport模块上提供的说明,我将其转换为词典列表,然后将其写入xpt文件。没问题,验证者很高兴。
我在努力的地方是将标签作为元数据添加到xpt文件中。这些说明很明显可以做到。我只是无法按照说明进行操作,所以我确定问题出在我自己,而不是说明。
我正在使用以下方法从数据帧转换数据:
rows = df.T.to_dict().values()
然后,当我执行以下操作时,数据将如下所示:
print(rows)
dict_values([{'STUDYID': '1195840', 'DOMAIN': 'PC', 'USUBJID': '1195840-P1201', 'POOLID': '', 'PCSEQ': 1, 'PCGRPID': '', 'PCREFID': '4048000169', 'PCSPID': '4048000169', 'PCTESTCD': 'DRUGXXXX', 'PCTEST': 'drugname', 'PCCAT': 'Analyte', 'PCSCAT': '', 'PCORRES': '<LLOQ', 'PCORRESU': 'ng/mL', 'PCSTRESC': 'BLQ', 'PCSTRESN': nan, 'PCSTRESU': '', 'PCSTAT': '', 'PCREASND': '', 'PCNAM': 'My Company', 'PCSPEC': 'SERUM', 'PCSPCCND': '', 'PCMETHOD': 'MSD', 'PCBLFL': '', 'PCFAST': '', 'PCDRVFL': '', 'PCLLOQ': 3, 'PCEXCLFL': '', 'PCREASEX': '', 'VISITDY': 1, 'PCDTC': '2019-01-22T00:00:00', 'PCENDTC': '', 'PCDY': 1.0, 'PCENDY': nan, 'PCTPT': 'Predose', 'PCTPTNUM': 0.0, 'PCELTM': 'PT0H', 'PCTPTREF': 'Day 1 Dose', 'PCRFTDTC': '2019-01-22T07:51:00', 'PCEVLINT': ''}, {'STUDYID': '1195840', 'DOMAIN': 'PC', 'USUBJID': '1195840-P1201', 'POOLID': '', 'PCSEQ': 2, 'PCGRPID': '', 'PCREFID': '4048000170', 'PCSPID': '4048000170', 'PCTESTCD': 'DRUGXXXX', 'PCTEST': 'drugname', 'PCCAT': 'Analyte', 'PCSCAT': '', 'PCORRES': '1490.', 'PCORRESU': 'ng/mL', 'PCSTRESC': '1490.', 'PCSTRESN': 1490.0, 'PCSTRESU': 'ng/mL', 'PCSTAT': '', 'PCREASND': '', 'PCNAM': 'My Company', 'PCSPEC': 'SERUM', 'PCSPCCND': '', 'PCMETHOD': 'MSD', 'PCBLFL': '', 'PCFAST': '', 'PCDRVFL': '', 'PCLLOQ': 3, 'PCEXCLFL': '', 'PCREASEX': '', 'VISITDY': 1, 'PCDTC': '2019-01-22T00:00:00', 'PCENDTC': '', 'PCDY': 1.0, 'PCENDY': nan, 'PCTPT': '8hr', 'PCTPTNUM': 8.0, 'PCELTM': 'PT8H', 'PCTPTREF': 'Day 1 Dose', 'PCRFTDTC': '2019-01-22T07:51:00', 'PCEVLINT': ''} ])
将数据写入xpt是通过以下方式完成的:
with open('example.xpt', 'wb') as f:
xport.from_rows(rows, f)
按照说明(https://github.com/selik/xport/或https://pypi.org/project/xport/),我将标签格式化为一个元组列表(尽管我对说明的理解似乎很落后,就像标签是键和列名一样)是值-我以为是名称作为键,标签作为值):
labels = [('Study Identifier','STUDYID'),
('Domain Abbreviation','DOMAIN'),
('Unique Subject Identifier','USUBJID'),
('Pool Identifier','POOLID'),
('Sequence Number','PCSEQ'),
('Group Identifier','PCGRPID'),
('Sample Identifier','PCREFID'),
('Sponsor Identifier','PCSPID'),
('Test Short Name','PCTESTCD'),
('Test Name','PCTEST'),
('Test Category','PCCAT'),
('Test Subcategory','PCSCAT'),
('Result or Findings as Collected','PCORRES'),
('Unit of the Original Result','PCORRESU'),
('Standardized Result in Character Format','PCSTRESC'),
('Standardized Result in Numeric Format','PCSTRESN'),
('Unit of the Standardized Result','PCSTRESU'),
('Completion Status','PCSTAT'),
('Reason Not Done','PCREASND'),
('Vendor Name','PCNAM'),
('Specimen Material Type','PCSPEC'),
('Specimen Condition','PCSPCCND'),
('Method of Test or Examination','PCMETHOD'),
('Baseline Flag','PCBLFL'),
('Fasting Status','PCFAST'),
('Derived Flag','PCDRVFL'),
('Lower Limit of Quantitation','PCLLOQ'),
('Exclusion Flag','PCEXCLFL'),
('Reason for Exclusion','PCREASEX'),
('Visit Day','VISITDY'),
('Date/Time of Specimen Collection','PCDTC'),
('End Date/Time of Specimen Collection','PCENDTC'),
('Study Day of Specimen Collection','PCDY'),
('Study Day of End of Specimen Collection','PCENDY'),
('Planned Time Point Name','PCTPT'),
('Planned Time Point Number','PCTPTNUM'),
('Planned Elapsed Time from Time Point Ref','PCELTM'),
('Time Point Reference','PCTPTREF'),
('Date/Time of Reference Point','PCRFTDTC'),
('Evaluation Interval','PCEVLINT')]
然后这些指令出现在我看来是使用相同的命令来写标签,但是那会覆盖已经写好的数据文件。
with open('example.xpt', 'wb') as f:
xport.from_rows(labels, f)