Фильтрация групп пустых ключей: функция фильтра - PullRequest
1 голос
/ 29 марта 2020

ПРОБЛЕМА: снова преобразовать filter(None, Dictionary) в словарь при фильтрации пустых ключей.

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

d = {'col1': [1, 1, 1, 2], 'col2': [1, 2, 2, 2], 'col3': [1, 2 ,3, 4], 'col4': [2,1,1,1,], 'col5': [2,1,0,0], 'col6': [2,1,3,1]}
df = pd.DataFrame(data=d)
all_groups = {}
for i in df.col1.unique():
    for j in df.col2.unique():
        all_groups[f'{i}-{j}'] = df[(df.col1 == i) & (df.col2 == j)]

Затем я хотел бы очистить все пустые ключи с помощью функционального фильтра: filter(None, all_groups), который выглядит как ответ на следующий вопрос:

[ как удалить пустой dict внутри списка словаря?

В документации сказано:

Вернуть итератор, выдающий те элементы итерируемой для какой функции (пункт) это правда. Если функция None, вернуть элементы, которые имеют значение true.

Мне нужно снова преобразовать эту возвращенную последовательность в словарь, но я не знаю как, потому что это просто объект фильтра.

РЕДАКТИРОВАТЬ 1: я пытался с лямбда-функциями:

 hello = dict(filter(lambda x: len(x) != 0, all_groups))

ValueError: dictionary update sequence element #0 has length 12; 2 is required

Ответы [ 2 ]

1 голос
/ 29 марта 2020

в вашем указанном c случае вы можете получить пустое lists в качестве значения, чтобы отфильтровать это, вы можете сделать:

1), используя понимание списка (это создаст новый dict)

dictionary = {k , v for k, v in dictionary.items() if v}

2) с помощью a для l oop и удалением ключей с пустыми списками в качестве значения (на месте):

for k, v in dictionary.items():
    if not v:
        dictionary.pop(k)

3) с использованием filter встроенного метод (это создаст новый dict)

dictionary = dict(filter(lambda x: x[1], dictionary.items()))

если у вас есть dict со значениями pd.DataFrame, вы можете отфильтровать пустой фрейм данных как:

dict(filter(lambda x: not x[1].empty, all_groups.items()))

вывод:

{'1-1':    col1  col2  col3  col4  col5  col6
 0     1     1     1     2     2     2,
 '1-2':    col1  col2  col3  col4  col5  col6
 1     1     2     2     1     1     1
 2     1     2     3     1     0     3,
 '2-2':    col1  col2  col3  col4  col5  col6
 3     2     2     4     1     0     1}
0 голосов
/ 30 марта 2020

Другой возможный ответ на этот вопрос - использование лямбда-функции:

hello = dict(filter(lambda x: len(x[1]) != 0, all_groups.items()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...