Уникальные предметы в панде с данными со списком - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь удалить все столбцы из кадра данных pandas, где в столбце меньше 10 уникальных элементов.Однако, некоторые из моих данных - списки, и я получаю ошибку unhashable type: 'list'.Имеет смысл, поскольку pandas сравнивается с хэш-картой.

Мой текущий код -

for i in df.columns:
    if len(df[i].unique()) < 10:
        df.drop(i, 1)

, который работает до тех пор, пока я не доберусь до объекта списка.Для моих целей, list1 и list2 не являются уникальными.[1, 2] и [2, 1] не являются уникальными, хотя [1, 2] == [2, 1] является False.

Как мне выполнить эту операцию?Разделять списки не имеет смысла, и я не могу явно напечатать столбцы, поскольку у меня их 1400.

Заранее большое спасибо!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

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

Предположим, у вас есть

df = pd.DataFrame({"A": [1,2,3,4], 
                   "B": ["a", "b", "c", "d"],
                   "C": [[1,2,3], [2], [2,3,1], [4]] })

    A   B   C
0   1   a   [1, 2, 3]
1   2   b   [2]
2   3   c   [2, 3, 1]
3   4   d   [4]

Таким образом, вы можете сделать что-то вроде

df.C.apply(sorted).transform(tuple).unique()

, который возвращает

array([(1, 2, 3), (2,), (4,)], dtype=object)

Таким образом, ваш код может быть примерно таким, как показано ниже, используя collections.Hashable, чтобы проверить, действительно ли содержимое столбца является хэшируемым или нет

import collections

for i in df.columns:
    if isinstance(df[i].iloc[0], collections.Hashable):
        if len(df[i].unique()) < 10: 
            df = df.drop(i, 1)
    else:
        if len(df[i].apply(sorted).transform(tuple).unique()) < 10: 
            df = df.drop(i, 1)

Обратите внимание, что это также относится к другим типам, которые невозможно отменить, например, dict s

>>> df["D"] = [{"a":2}, {}, {"k":3}, {"k":3}]})
>>> print(df.D.apply(sorted).transform(tuple).unique())
[('a',) () ('k',)]
0 голосов
/ 18 мая 2018

Один из способов - преобразовать проблемные типы в альтернативные.В приведенном ниже примере имеется 14 элементов, но [1, 2] == [2, 1] после преобразования обеих сторон в frozenset и, кроме того, 0 == False.Итак, мы вычисляем 12 уникальных значений.

s = pd.Series([[1, 2], [2, 1], (1, 2, 3), {5, 1}, 3142, 563.123, np.nan, 'dfa',
               '', 'dsafa', 3214, 0, True, False])

print(len(s))  # 14

def converter(x):
    return frozenset(x) if isinstance(x, (set, list)) else x

print(len(s.apply(converter).unique()))  # 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...