如何从CSV文件中推断候选键并输出对应列的全部取值
代码修改方案
改动说明
- 补全原代码缺失的
glob、os模块导入,修正pandas别名声明,解决基础运行报错 - 移除了函数调用外层多余的
print,避免输出无意义的None值(该函数无返回值) - 在候选键判定通过的逻辑分支下,新增遍历候选键列、提取列取值并按指定格式打印的逻辑
- 原代码中
key_options函数内的调试打印print(7,items)如果不需要可以自行删除
完整修改后代码
import pandas as pd import glob import os from itertools import chain, combinations def key_options(items): # 调试打印如不需要可删除 print(7,items) return chain.from_iterable(combinations(items, r) for r in range(1, len(items)+1)) def primary_key_discovery(data_path): csv_files = glob.glob(os.path.join(data_path, "*.csv")) for f in csv_files: df = pd.read_csv(f) for candidate in key_options(list(df.columns)[1:]): deduped = df.drop_duplicates(candidate) if len(deduped.index) == len(df.index): # 打印原格式的文件和候选键信息 print(f, ','.join(candidate)) # 新增:打印每个候选键列的取值 for col in candidate: # 这里用unique()取去重后的值,如需打印全部原始值,去掉.unique()即可 col_values = df[col].unique().astype(str).tolist() print(f"{col}:{','.join(col_values)}") primary_key_discovery('Data1/')
输出效果示例
运行后输出格式如下:
Data1\vehicle.csv model,price,engine-size model:camery,altima,aclass price:18000,22000,25000 engine-size:2.0,2.5,1.3
内容的提问来源于stack exchange,提问作者Noor Khalaf Alhammad
相关产品推荐
相关产品推荐

