我们从外部实验室和中心收到了许多不同的CSV文件.当收到这样的文件时,我们首先需要做一些QA判断,然后才能进一步处理.因此,确保数据是正确的,至少在技术层面上是正确的.
我们有一些Python脚本来判断列数、判断日期值、最小/最大范围等.但现在我们还想判断枚举列是否正确.因此,例如,如果列访问是一个编码值,并且可能只包含baseline
、fup_6_m
、fup_12_m
,则它不应该包含其他任何内容,如fup_36_m
.
我们有元数据规范,因此列名和编码值列表(也称为枚举)是预先知道的.
这是我到目前为止得到的Python脚本:
# check if coded values are correct
import pandas as pd
import io
## load data from csv files
##df = pd.read_csv (r'patlist_mcl2017.csv', sep = ",", decimal=".")
# TESTING: create data frame from text
str_patients = """patid,dob,sex,height,score,visit
1072,16-01-1981,M,154,1,fup_12_m
1091,20-12-1991,M,168,4,baseline
1126,25-12-1999,M,181,3,fup_6_m
1139,14-04-1980,Y,165,1,baseline
1171,05-11-1984,M,192,2,fup_12_m
1237,17-08-1983,F,170,3,fup_6_m
1334,26-08-1985,F,160,5,fup_6_m
1365,14-09-1976,M,184,3,fup_24_m
1384,28-12-1993,F,152,1,baseline
1456,27-09-1998,F,164,5,fup_12_m
"""
df = pd.read_csv(io.StringIO(str_patients), sep = ",", decimal=".")
print(df)
# allowed values for enumeration columnms
allowed_enum = {
'sex': ['M', 'F'],
'score': [0, 1, 2, 3, 4],
'visit': ['baseline', 'fup_6_m', 'fup_12_m']
}
# check enumeration
for column_name, allowed_values in allowed_enum.items():
df_chk = df[~df[column_name].isin(allowed_values)].groupby(column_name).size().reset_index(name='Count')
if not df_chk.empty:
print("Found invalid values for column '%s':" % column_name)
print(df_chk)
它工作正常,输出如下所示:
Found invalid values for column 'sex':
sex Count
0 Y 1
Found invalid values for column 'score':
score Count
0 5 2
Found invalid values for column 'visit':
visit Count
0 fup_24_m 1
但不同的文件可以包含许多列,为了更好地报告,我们希望将输出作为一个数据帧,因此如下所示:
Column_name Invalid Count
0 Sex Y 1
1 Score 5 2
2 visit fup_24_m 1
所以我的问题是:
- 如上所述,收集数据帧中的无效值的最佳方法是什么?
- 或者,有没有更好的方法来判断/验证这些编码值?