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',)]