Dataframe — выберите минимальный набор строк, чтобы охватить все возможные значения каждого столбца

Я работаю над вариантом использования, в котором мне нужно получить минимальную выборку строк из кадра данных, содержащего хотя бы одну строку для каждого уникального значения, найденного во всех столбцах.

Упрощенным примером может быть:

ИДЕНТИФИКАТОР А Б С 1 Д Г Х 2 Д Г Да 3 Э Г Да 4 Э ЧАС Да 5 Ф я З

Здесь я хотел бы сохранить строки с идентификаторами 1, 4 и 5, чтобы иметь хотя бы одну строку со значениями D, E и F из A; G, H и I из B и X, Y и Z из C. Мне не нужны все комбинации, только все уникальные значения из каждого столбца:

ИДЕНТИФИКАТОР А Б С 1 Д Г Х 4 Э ЧАС Да 5 Ф я З

Каким может быть эффективный способ сделать это?

Спасибо

🤔 А знаете ли вы, что...
Python поддерживает множество парадигм программирования, включая процедурное, объектно-ориентированное и функциональное программирование.


2
91
2

Ответы:

вот минимальный пример, который поможет вам начать работу.

USING: # (tab separated !)
ID  COLA    COLB    COLC    COLD
1   D   G   X   
2   D   G       K
3   E   G   M   
4   E   H       L
5   F   I   Z   L
6   O   Z       P

#this code
import pandas as pd
df = pd.read_csv('input1.csv', sep='\t')

# get the columns - skipping the first
# remove 'nan', then get unique values using 'set' sorted
for col in list(df)[1:]:
    wk=[ member for member in df[col] if not(pd.isnull(member)) == True]
    print(f'{col} {sorted(set(wk))}')

#produces
COLA ['D', 'E', 'F', 'O']
COLB ['G', 'H', 'I', 'Z']
COLC ['M', 'X', 'Z']
COLD ['K', 'L', 'P']

надеюсь, это чем-то поможет


Решено

Вот что у меня в итоге получилось:

  • Подсчитайте количество вхождений каждого значения в каждом столбце и упорядочите их по возрастанию.
  • Выберите случайную строку, содержащую наименее встречающееся значение из всех, и добавьте это значение и все остальные из выбранной строки в словарь.
  • Просматривая мой упорядоченный список значений, подсчитайте количество «новых значений» для каждой строки, содержащей текущее значение списка, в котором находится цикл. Выберите строку с наибольшим количеством «новых значений».
  • Повторяйте, пока не будут выбраны все значения.

Это далеко не оптимальное решение, поскольку я лишь минимизирую количество строк на каждом шаге, но оно довольно эффективно и выполняет свою работу. Вероятно, можно было бы использовать рекурсивный алгоритм для проверки всех решений, но у меня нет больших требований к окончательному набору строк, за исключением того, что для этого нужны все возможные значения.

Спасибо всем за участие, они помогли мне найти это решение.