如何验证DataFrame每行多列列表长度一致性并生成校验列?
需求实现:校验DataFrame行内列表长度一致性
问题背景
现有如下结构的Pandas DataFrame,每列存储浮点数列表:
import pandas as pd df = pd.DataFrame([ ([40.33, 40.34, 40.22],[-71.11, -71.21, -71.14],[12, 45, 10]), ([41.23, 41.40, 41.22],[-72.01, -72.01, -72.01],[11, 23, 15]), ([43.33, 43.34],[-70.11, -70.21],[12, 40]), ([41.23, 41.40], [-72.01, -72.01, -72.01], [11, 23, 15]) ], columns=['long', 'lat', 'accuracy'])
数据展示:
long lat accuracy [40.33, 40.34, 40.22] [-71.11, -71.21, -71.14] [12, 45, 10] [41.23, 41.40, 41.22] [-72.01, -72.01, -72.01] [11, 23, 15] [43.33, 43.34] [-70.11, -70.21] [12, 40] [41.23, 41.40] [-72.01, -72.01, -72.01] [11, 23, 15]
需要新增一列sanity,规则为:每行中long、lat、accuracy三列的列表长度完全一致时,值为TRUE,否则为FALSE,预期输出:
long lat accuracy sanity [40.33, 40.34, 40.22] [-71.11, -71.21, -71.14] [12, 45, 10] TRUE [41.23, 41.40, 41.22] [-72.01, -72.01, -72.01] [11, 23, 15] TRUE [43.33, 43.34] [-70.11, -70.21] [12, 40] TRUE [41.23, 41.40] [-72.01, -72.01, -72.01] [11, 23, 15] FALSE
最优实现方法
方法1:简洁直观法(适合中小数据集)
用apply结合lambda表达式逐行校验:
df['sanity'] = df.apply(lambda row: len(row['long']) == len(row['lat']) == len(row['accuracy']), axis=1)
方法2:矢量化计算法(性能更优,适合大数据集)
先批量计算各列列表长度,再行内比较一致性:
# 计算每列的列表长度 len_long = df['long'].str.len() len_lat = df['lat'].str.len() len_acc = df['accuracy'].str.len() # 生成sanity列 df['sanity'] = (len_long == len_lat) & (len_lat == len_acc)
说明
- 方法1代码简洁、逻辑清晰,上手成本低;
- 方法2采用Pandas矢量化操作,避免逐行循环,数据量越大性能优势越明显;
- 两种方法输出结果完全一致,可根据数据集规模灵活选择。
内容的提问来源于stack exchange,提问作者Tristan Tran
相关产品推荐
相关产品推荐

