pyspark डेटाफ़्रेम में अलग कॉलम मान दिखाएं: अजगर


85

कृपया पंडों के लिए pyspark डेटाफ्रेम विकल्प का सुझाव दें df['col'].unique()

मैं एक pyspark डेटाफ़ॉर्म कॉलम में सभी अद्वितीय मानों को सूचीबद्ध करना चाहता हूं।

SQL प्रकार का तरीका नहीं (अलग-अलग मानों के लिए फिर SQL क्वेरी रजिस्टर करें)।

इसके अलावा मुझे ज़रूरत नहीं है groupby->countDistinct, इसके बजाय मैं उस कॉलम में अलग-अलग वैल्यूज़ चेक करना चाहता हूँ।

जवाबों:


86

मान लें कि हम डेटा के निम्नलिखित प्रतिनिधित्व के साथ काम कर रहे हैं (दो कॉलम, kऔर v, kजिसमें तीन प्रविष्टियाँ हैं, दो अद्वितीय हैं:

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

पंडों के डेटाफ्रेम के साथ:

import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()

यह एक रिटर्न ndarray(यानी)array(['foo', 'bar'], dtype=object)

आपने "pasas df ['col'] के लिए" pyspark dataframe विकल्प "के लिए कहा है। अद्वितीय ()"। अब, निम्नलिखित स्पार्क डेटाफ्रेम दिया गया है:

s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))

यदि आप स्पार्क से एक ही परिणाम चाहते हैं , अर्थात ndarray, का उपयोग करें toPandas():

s_df.toPandas()['k'].unique()

वैकल्पिक रूप से, यदि आपको ndarrayविशेष रूप से और केवल कॉलम के अनूठे मूल्यों की सूची की आवश्यकता नहीं है k:

s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()

अंत में, आप निम्नानुसार एक सूची समझ का उपयोग भी कर सकते हैं:

[i.k for i in s_df.select('k').distinct().collect()]

1
हाय eddies, अंतिम कोड लाइन अलग ()। नक्शा () मेरे लिए काम नहीं किया। त्रुटि: विशेषता: 'DataFrame' ऑब्जेक्ट में कोई विशेषता 'मैप' नहीं है। मैं स्पार्क 2.0 पर हूं। और पंडों की बात, मैं यह नहीं कहूंगा कि यह एक विकल्प है, यह स्पार्क डेटाफ्रेम को पहले पंडों के डेटाफ्रेम में परिवर्तित करता है और फिर उस पर पांडा ऑपरेशन करता है।
सत्या

1
हाय सत्या। .rddबाद में कॉल जोड़कर उत्तर को अपडेट किया distinct()। इसके बिना स्पार्क 1.6.2 में काम किया, लेकिन मैंने अभी पुष्टि की है कि संपादित उत्तर स्पार्क 2.0.0 में भी काम करता है।
eddies

4
स्पंदन डेटाफ़्रेम परिचालनों को पंडों के डेटाफ़्रेम (यदि इसकी विशालता को चोट पहुँचती है) में परिवर्तित करके या rdd प्रचालनों का उपयोग करने से बचने की कोशिश करें जब स्पार्क डेटाफ़्रेम ऐसा करने में पूरी तरह से सक्षम हों? @Pabbati
लॉरेन्स कोपेनोल

@Laurens ऊपर दिए गए जवाब में तीन समाधान थे, यह इस बात पर निर्भर करता है कि पोस्टर वास्तव में क्या चाहता था। सभी मामलों में, पोस्टर अलग-अलग मानों की एक सूची / सरणी के कुछ रूप चाहता था (सीफ पोस्टर के उत्तर के लिए सीएफ पोस्टर की प्रतिक्रिया)। उपरोक्त तीसरा समाधान स्पार्क के डेटाफ्रेम एपि का उपयोग सिर्फ पब्बती के उत्तर के रूप में करता है लेकिन वास्तव में पोस्ट की आवश्यकताओं के अनुसार एक सूची देता है।
eddies

1
हां, प्रश्न शीर्षक में "शो" शब्द शामिल है। लेकिन पोस्टर ने विशेष रूप से स्पष्ट किया कि परिणाम देखना पर्याप्त नहीं था और एक सूची चाहता था। जैसा कि ऊपर उल्लेख किया गया है, पोस्टर के उत्तर को सेफ़गनर के उत्तर में देखें।
एडी

200

इससे स्तंभ के अलग-अलग मान प्राप्त करने में मदद मिलेगी:

df.select('column1').distinct().collect()

ध्यान दें कि .collect()कोई भी अंतर्निहित सीमा नहीं है कि कितने मान वापस आ सकते हैं ताकि यह धीमा हो सकता है - .show()इसके बजाय इसका उपयोग करें या इसे प्रबंधित करने से .limit(20)पहले जोड़ें .collect()


यह कोड ऐसा डेटा लौटाता है जो पुनरावृत्ति योग्य नहीं है, अर्थात मैं देख रहा हूँ कि भिन्न डेटा बिट कोड में इसे पुनरावृत्त करने में सक्षम नहीं है। कोई अन्य तरीका जो मुझे ऐसा करने में सक्षम बनाता है। मैंने पंडों डीएफ में परिवर्तित करने के लिए पंडों () का उपयोग करने की कोशिश की और फिर अद्वितीय मूल्यों के साथ पुनरावृत्ति प्राप्त की। हालाँकि, '' पंडों को नहीं मिला '' त्रुटि संदेश
अभि

6
@Abhi: insh .show () के बजाय एक .collect () करें, इस तरह से आपको उस विशेष कॉलम के सभी विशिष्ट मानों का पुनरावृत्ति मिल जाएगा। लेकिन यह सुनिश्चित करें कि आपके मास्टर नोड में उन अद्वितीय मूल्यों को रखने के लिए पर्याप्त मेमोरी है, क्योंकि कलेक्ट सभी डेटा (इस मामले में कॉलम के अनूठे मान) को नोड में मास्टर करने के लिए धक्का देगा :)
सत्या

1
@Satya मैंने जवाब में आपकी टिप्पणी संपादित की है, धन्यवाद
माइकल क्रिनिको ने

14

आप df.dropDuplicates(['col1','col2'])सरणी में कॉलएक्स पर आधारित केवल अलग पंक्तियों को प्राप्त करने के लिए उपयोग कर सकते हैं ।


2
@ seufagner- हाँ मैं एक df.dropDupurtes (['col1']) को देख सकता हूं (एसईई को चिह्नित करता हूं) को देखने के लिए, लेकिन एक संग्रह के बिना (to_rdd या पांडा DF के लिए तो df ('col']) ()। , मैं अद्वितीय मान सूची प्राप्त नहीं कर सकता। सुझाव के लिए धन्यवाद।
सत्या

उपयोगकर्ता ने यह नहीं पूछा कि गैर डुप्लिकेट मूल्यों को कैसे प्रदर्शित किया जाए .. वह केवल सभी अद्वितीय / विशिष्ट वस्तुओं की एक सूची प्राप्त करना चाहता था, जिसमें डुप्लिकेट भी शामिल हैं!
उत्सव झा

6

संग्रह_सेट किसी दिए गए कॉलम pyspark.sql.DataFrame से अद्वितीय मान प्राप्त करने में मदद कर सकता है df.select(F.collect_set("column").alias("column")).first()["column"]


1

यदि आप सभी (कॉलम) डेटा को अलग-अलग फ्रॉम के रूप में चुनना चाहते हैं तो डेटाफ्रैम (डीएफ), फिर

df.select('*').distinct().show(10,truncate=False)


1

तुम यह कर सकते थे

distinct_column = 'somecol' 

distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]

0

dropDuplicatesविकल्प के अलावा वहाँ विधि है जिसका नाम हम इसे जानते हैं :pandas drop_duplicates

drop_duplicates () के लिए एक उपनाम है dropDuplicates ()

उदाहरण

s_df = sqlContext.createDataFrame([("foo", 1),
                                   ("foo", 1),
                                   ("bar", 2),
                                   ("foo", 3)], ('k', 'v'))
s_df.show()

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

सबसेट द्वारा ड्रॉप

s_df.drop_duplicates(subset = ['k']).show()

+---+---+
|  k|  v|
+---+---+
|bar|  2|
|foo|  1|
+---+---+
s_df.drop_duplicates().show()


+---+---+
|  k|  v|
+---+---+
|bar|  2|
|foo|  3|
|foo|  1|
+---+---+


0

यदि आप अपने डेटाफ़्रेम में किसी विशिष्ट कॉलम के अलग-अलग मूल्यों को देखना चाहते हैं, तो आपको बस लिखने की आवश्यकता होगी -

    df.select('colname').distinct().show(100,False)

यह df डेटाफ़्रेम में colname कॉलम के लिए 100 अलग-अलग मान (यदि 100 मान उपलब्ध हैं) दिखाएगा।

यदि आप अलग-अलग मूल्यों पर कुछ करना चाहते हैं, तो आप एक वेक्टर में अलग-अलग मूल्यों को बचा सकते हैं

    a = df.select('colname').distinct()

यहाँ, कॉलम कॉलम के सभी विशिष्ट मान होंगे

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.