मेरे पास निम्न डेटाफ़्रेम है:

import pandas as pd
df = pd.DataFrame({'name': ["John", "Jack", "Jeff", "Kate"], "hobbies":[["pirates"], ["pirates"], ["climbing", "yoga"], ["yoga"]]})

# name  hobbies
# 0 John    [pirates]
# 1 Jack    [pirates]
# 2 Jeff    [climbing, yoga]
# 3 Kate    [yoga]

मैं शौक में अद्वितीय सूचियों की एक सूची रखना चाहता हूं। बस स्पष्ट होने के लिए, मुझे अद्वितीय शौक (यानी ["pirates", "climbing", "yoga"]) की सूची नहीं चाहिए, जो पहले से ही कई प्रश्नों में शामिल है: पंडों को सूचियों के कॉलम से अद्वितीय मान मिलते हैं

मुझे इसके बजाय सूची [['pirates'], ['yoga'], ['climbing', 'yoga']] चाहिए।

मैंने निम्नलिखित तरीके से सोचा है लेकिन यह बहुत "पांडा-आईसी" प्रतीत नहीं होता है:

[list(t) for t in {tuple(h) for h in df["hobbies"]}]

इसे करने का कोई बेहतर तरीका है?

2
Jean-Francois T. 24 जिंदा 2021, 19:17

3 जवाब

सबसे बढ़िया उत्तर

आप इसे करने के लिए numpy का उपयोग कर सकते हैं:

import numpy as np

np.unique(df['hobbies'].to_numpy()).tolist()
2
Jean-Francois T. 25 जिंदा 2021, 03:51

आइए हम list को tuple में बदलें ताकि हम drop_duplicates कर सकें

out = df.hobbies.apply(tuple).drop_duplicates().apply(list).tolist()
Out[143]: [['pirates'], ['climbing', 'yoga'], ['yoga']]

यदि आपको वापस list में कनवर्ट करने की आवश्यकता नहीं है, तो आप यह कर सकते हैं:

df.hobbies.apply(tuple).unique()
3
Jean-Francois T. 25 जिंदा 2021, 03:51

सूचियाँ हैशेबल कुंजियाँ नहीं हैं, इसके बजाय एक टपल का उपयोग करें और फिर सूची में कनवर्ट करें

[*map(list,df['hobbies'].map(tuple).unique())]

आउटपुट:

[['pirates'], ['climbing', 'yoga'], ['yoga']]

मैप ऑब्जेक्ट पर किसी सूची को कॉल करने पर अनपैकिंग का उपयोग मेरे लिए तेजी से साबित हुआ है

%%timeit
list(map(list,df['hobbies'].map(tuple).unique()))
385 µs ± 67.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%%timeit
[*map(list,df['hobbies'].map(tuple).unique())]
296 µs ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
2
anky 24 जिंदा 2021, 19:31