在R中基于条件识别值:为2300万行数据生成LP列
解决方案:为2300万行CSV生成LP列
针对你处理超大规模CSV的需求,以下是几种高效可行的方案,覆盖Python、SQL、命令行工具三种场景:
方案一:Python Pandas/Dask(本地大数据处理)
适合具备基础Python能力的场景,Pandas适合内存足够的情况,Dask则针对内存不足的并行处理需求。
内存充足时用Pandas
import pandas as pd # 读取CSV文件 df = pd.read_csv("your_dataset.csv") # 分组统计每个N_AIH对应的IDENT取值集合 n_aih_ident_map = df.groupby("N_AIH")["IDENT"].unique() # 生成YES/NO映射规则 lp_rule = n_aih_ident_map.apply(lambda x: "YES" if {1,5}.issubset(x) else "NO") # 将规则映射回原数据集 df["LP"] = df["N_AIH"].map(lp_rule) # 保存结果 df.to_csv("result_with_lp.csv", index=False)
内存不足时用Dask(并行分片处理)
import dask.dataframe as dd # 以分片方式读取CSV df = dd.read_csv("your_dataset.csv") # 分组统计每个N_AIH是否包含1和5 n_aih_flags = df.groupby("N_AIH")["IDENT"].apply( lambda x: "YES" if {1,5}.issubset(x.unique()) else "NO", meta=("LP", "object") ).reset_index() # 合并规则与原数据 df = df.merge(n_aih_flags, on="N_AIH") # 保存结果(Dask会生成多个分片文件,可自行合并) df.to_csv("result_lp_*.csv", index=False)
方案二:SQL(数据库端处理)
若你已将CSV导入数据库(如MySQL、PostgreSQL),可通过以下高效SQL语句实现,避免之前可能的写法错误:
高效分组关联写法
WITH n_aih_check AS ( SELECT N_AIH, -- 标记该N_AIH是否存在IDENT=1 MAX(CASE WHEN IDENT = 1 THEN 1 ELSE 0 END) AS has_1, -- 标记该N_AIH是否存在IDENT=5 MAX(CASE WHEN IDENT = 5 THEN 1 ELSE 0 END) AS has_5 FROM your_table GROUP BY N_AIH ) SELECT t.N_AIH, t.IDENT, CASE WHEN nc.has_1 = 1 AND nc.has_5 = 1 THEN 'YES' ELSE 'NO' END AS LP FROM your_table t JOIN n_aih_check nc ON t.N_AIH = nc.N_AIH;
简易EXISTS写法(适合小数据集参考)
SELECT N_AIH, IDENT, CASE WHEN EXISTS (SELECT 1 FROM your_table t2 WHERE t2.N_AIH = t.N_AIH AND t2.IDENT = 1) AND EXISTS (SELECT 1 FROM your_table t2 WHERE t2.N_AIH = t.N_AIH AND t2.IDENT = 5) THEN 'YES' ELSE 'NO' END AS LP FROM your_table t;
方案三:命令行Awk(无编程基础快速处理)
适合Linux/macOS或Windows WSL环境,无需额外安装工具:
- 创建名为
lp_rule.awk的脚本文件:
BEGIN { FS=","; OFS="," } # 处理表头 NR == 1 { print $0, "LP"; next } # 第一次遍历记录每个N_AIH的IDENT情况 { if (!($1 in has_1)) has_1[$1] = 0 if (!($1 in has_5)) has_5[$1] = 0 if ($2 == 1) has_1[$1] = 1 if ($2 == 5) has_5[$1] = 1 lines[NR] = $0 } # 第二次遍历生成LP列 END { for (i=2; i<=NR; i++) { split(lines[i], arr, ",") n_aih = arr[1] print lines[i], (has_1[n_aih] && has_5[n_aih] ? "YES" : "NO") } }
- 运行命令处理CSV:
awk -f lp_rule.awk your_dataset.csv > result_with_lp.csv
内容的提问来源于stack exchange,提问作者user20477516
相关产品推荐
相关产品推荐

