簡體   English   中英

帶有列表的pandas數據框中的唯一項

[英]Unique Items in a pandas dataframe with a list

我正在嘗試從pandas數據框中刪除所有列,其中列中的唯一項目少於10個。 但是,我的一些數據是列表,我得到錯誤unhashable type: 'list' 有道理,因為pandas與hashmap相比較。

我目前的代碼是

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]為假。

我該如何進行這項操作? 將列表分開是沒有意義的,因為我有1400個列,所以我無法明確地輸入列。

提前謝謝了!

list對象不可清除,因為它們是可變的,但另一方面, tuple是不可變的。 您可以transform列表值transformtuple並使用此屬性。

假設你有

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

>>> df["D"] = [{"a":2}, {}, {"k":3}, {"k":3}]})
>>> print(df.D.apply(sorted).transform(tuple).unique())
[('a',) () ('k',)]

一種方法是將麻煩的類型轉換為可清除的替代品。 在下面的例子中,有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM