如何在 CSV 文件中查找为主键候选设置的列?

gml*_*vsv 5 python sql algorithm pandas

我有一个 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
Run Code Online (Sandbox Code Playgroud)

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

期望的输出:

  1) ID
  2) PAYMENT_NUM,START_DATE,END_DATE
  3) CUST_NAME, CLIENT_NAME, PAYMENT_NUM,START_DATE,END_DATE
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*han 7

pandas 和 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)
Run Code Online (Sandbox Code Playgroud)

这为您提供了输出:

PAYMENT_NUM, END_DATE
CUST_NAME, CLIENT_NAME, END_DATE
CUST_NAME, PAYMENT_NUM, END_DATE
CLIENT_NAME, PAYMENT_NUM, END_DATE
PAYMENT_NUM, START_DATE, END_DATE
CUST_NAME, CLIENT_NAME, PAYMENT_NUM, END_DATE
CUST_NAME, CLIENT_NAME, START_DATE, END_DATE
CUST_NAME, PAYMENT_NUM, START_DATE, END_DATE
CLIENT_NAME, PAYMENT_NUM, START_DATE, END_DATE
CUST_NAME, CLIENT_NAME, PAYMENT_NUM, START_DATE, END_DATE
Run Code Online (Sandbox Code Playgroud)

  • 因为ID本身是合适的,所以每一个包含ID的组合也是合适的。这似乎不是有用的输出。您可以通过从 `for` 循环中删除 `[1:]` 来再次包含它。 (2认同)