如何在CSV文件中找到主键候选列集?

2024-04-24 08:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CSV文件(未规范化,例如,实际文件最多100列):

   ID, CUST_NAME, CLIENT_NAME, PAYMENT_NUM, START_DATE, END_DATE
    1,     CUST1,     CLIENT1,          10, 2018-04-01, 2018-04-02
    2,     CUST1,     CLIENT1,          10, 2018-04-01, 2018-05-30
    3,     CUST1,     CLIENT1,         101, 2018-04-02, 2018-04-03
    4,     CUST2,     CLIENT1,         102, 2018-04-02, 2018-04-03

如何找到可以用作主键的所有可能的列集合。在

期望输出:

^{pr2}$

我可以用Java实现,但Python/Pandas可能已经提供了一个快速的解决方案


Tags: 文件csvnameclientiddatepayment规范化
2条回答

这是通过itertools.combinations的一种方式。它的工作原理是,对于每一组列,删除重复项并检查数据帧的大小是否发生变化。在

这导致44个不同的列组合。在

from itertools import combinations, chain

full_list = chain.from_iterable(combinations(df, i) for i in range(1, len(df.columns)+1))

n = len(df.index)

res = []
for cols in full_list:
    cols = list(cols)
    if len(df[cols].drop_duplicates().index) == n:
        res.append(cols)

print(len(res))  # 44

熊猫和itertools会给你你想要的。在

import pandas
from itertools import chain, combinations

def key_options(items):
    return chain.from_iterable(combinations(items, r) for r in range(1, len(items)+1) )

df = pandas.read_csv('test.csv');

# iterate over all combos of headings, excluding ID for brevity
for candidate in key_options(list(df)[1:]):
    deduped = df.drop_duplicates(candidate)

    if len(deduped.index) == len(df.index):
        print ','.join(candidate)

这将为您提供以下输出:

^{pr2}$

相关问题 更多 >