पंडों के अनूठे मूल्य कई कॉलम हैं


134
df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
                   'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
                   'Col3': np.random.random(5)})

'Col1' और 'Col2' के अनूठे मूल्यों को लौटाने का सबसे अच्छा तरीका क्या है?

वांछित उत्पादन है

'Bob', 'Joe', 'Bill', 'Mary', 'Steve'

3
पांडा डेटा फ्रेम में चयनित कॉलमों में मूल्यों के अनूठे संयोजन भी देखें और एक अलग लेकिन संबंधित प्रश्न के लिए गणना करें । वहाँ चयनित उत्तर का उपयोग करता हैdf1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
पॉल रूजीक्स

जवाबों:


198

pd.unique इनपुट एरे, या डेटाफ़्रेम कॉलम या इंडेक्स से अद्वितीय मान लौटाता है।

इस फ़ंक्शन के इनपुट को एक-आयामी होने की आवश्यकता है, इसलिए कई कॉलमों को संयोजित करने की आवश्यकता होगी। सबसे सरल तरीका यह है कि आप अपने इच्छित कॉलमों का चयन करें और फिर एक चपटा नुमाइ सरणी में मान देखें। पूरा ऑपरेशन इस तरह दिखता है:

>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)

ध्यान दें कि ravel()एक व्यूह विधि की तुलना में एक सरणी विधि है (यदि संभव हो तो) एक बहुआयामी सरणी का। तर्क 'K'सरणी को समतल करने की विधि बताता है कि तत्वों को मेमोरी में संग्रहीत किया जाता है (पांडा आमतौर पर फोर्ट्रान-सन्निहित आदेश में अंतर्निहित सरणियों को संग्रहीत करता है ; पंक्तियों से पहले कॉलम)। यह विधि के डिफ़ॉल्ट 'C' क्रम का उपयोग करने की तुलना में काफी तेज हो सकता है।


एक वैकल्पिक तरीका है कि कॉलम का चयन करें और उन्हें पास करें np.unique:

>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)

यहां उपयोग करने की आवश्यकता नहीं ravel()है क्योंकि विधि बहुआयामी सरणियों को संभालती है। फिर भी, यह धीमी गति से होने की संभावना है pd.uniqueक्योंकि यह अद्वितीय मूल्यों की पहचान करने के लिए एक हैशटेबल के बजाय एक सॉर्ट-आधारित एल्गोरिथ्म का उपयोग करता है।

बड़े DataFrames के लिए गति में अंतर महत्वपूर्ण है (विशेषकर यदि केवल कुछ विशिष्ट मूल्य हैं)

>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop

>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop

>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop

2
आपको किसी सरणी के बजाय डेटाफ़्रेम वापस कैसे मिलेगा?
लिस्ले

1
@Lisle: दोनों विधियाँ एक NumPy सरणी लौटाती हैं, इसलिए आपको इसका निर्माण मैन्युअल रूप से करना होगा, उदा pd.DataFrame(unique_values)। डेटाफ्रैम को सीधे वापस पाने का कोई अच्छा तरीका नहीं है।
एलेक्स रिले

@Lisle के बाद से उसने pd.unique का उपयोग किया है यह एक अंतिम आउटपुट के रूप में एक numpy.ndarray देता है। यह वही है जो आप पूछ रहे थे?
आशी उपाध्याय

1
@ लिसल, शायद यह एक df = df.drop_duplicates (सबसेट = ['C1', 'C2', 'C3'])?
टिकटी आलू

14

मेरे पास DataFrameकॉलम में कुछ सरल स्ट्रिंग्स के साथ सेटअप है :

>>> df
   a  b
0  a  g
1  b  h
2  d  a
3  e  e

आप उन स्तंभों को संक्षिप्त कर सकते हैं जिन्हें आप रुचि रखते हैं और uniqueफ़ंक्शन को कॉल करते हैं:

>>> pandas.concat([df['a'], df['b']]).unique()
array(['a', 'b', 'd', 'e', 'g', 'h'], dtype=object)


3

सुपीरियर v1.13 + का उपयोग कर एक अद्यतन समाधान को कई स्तंभों का उपयोग करते हुए np.unique में अक्ष को निर्दिष्ट करने की आवश्यकता होती है , अन्यथा सरणी स्पष्ट रूप से चपटी है।

import numpy as np

np.unique(df[['col1', 'col2']], axis=0)

यह परिवर्तन नवंबर 2016 को पेश किया गया था: https://github.com/numpy/numpy/commit/1f764dbff7c496d6636dc0430f083ada9ff4e4be


1

गैर- pandasसमाधान: सेट का उपयोग करके ()।

import pandas as pd
import numpy as np

df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
              'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
               'Col3' : np.random.random(5)})

print df

print set(df.Col1.append(df.Col2).values)

आउटपुट:

   Col1   Col2      Col3
0   Bob    Joe  0.201079
1   Joe  Steve  0.703279
2  Bill    Bob  0.722724
3  Mary    Bob  0.093912
4   Joe  Steve  0.766027
set(['Steve', 'Bob', 'Bill', 'Joe', 'Mary'])

1

हम में से उन लोगों के लिए जो सभी चीज़ों से प्यार करते हैं, लागू होते हैं, और निश्चित रूप से लंबोदर कार्य करते हैं:

df['Col3'] = df[['Col1', 'Col2']].apply(lambda x: ''.join(x), axis=1)

1

यहाँ एक और तरीका है


import numpy as np
set(np.concatenate(df.values))

0
list(set(df[['Col1', 'Col2']].as_matrix().reshape((1,-1)).tolist()[0]))

आउटपुट ['मैरी', 'जो', 'स्टीव', 'बॉब', 'बिल' होगा।

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