पांडा में कई डेटा फ्रेम कॉलम में "अलग-अलग" कैसे चुनें?


104

मैं एसक्यूएल के बराबर करने के लिए एक रास्ता खोज रहा हूं

SELECT DISTINCT col1, col2 FROM dataframe_table

पांडा एसक्यूएल तुलना के बारे में कुछ भी नहीं है distinct

.unique() केवल एक ही कॉलम के लिए काम करता है, इसलिए मुझे लगता है कि मैं कॉलम को संक्षिप्त कर सकता हूं, या उन्हें सूची / टपल में डाल सकता हूं और इस तरह से तुलना कर सकता हूं, लेकिन ऐसा लगता है कि कुछ पांडा को अधिक मूल तरीके से करना चाहिए।

क्या मुझे कुछ स्पष्ट याद आ रहा है, या ऐसा करने का कोई तरीका नहीं है?


आपको ऐसा कुछ करना होगा, df.apply(pd.Series.unique)लेकिन यह काम नहीं करेगा यदि अद्वितीय मानों की संख्या कॉलमों में भिन्न होती है, तो आपको स्तंभों के नामों की एक कुंजी और मानों के रूप में अनन्य मानों का निर्माण करना होगा
EdChum

जवाबों:


175

आप drop_duplicatesकिसी DataFrame में अद्वितीय पंक्तियों को प्राप्त करने के लिए विधि का उपयोग कर सकते हैं :

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

subsetयदि आप केवल विशिष्टता निर्धारित करने के लिए कुछ स्तंभों का उपयोग करना चाहते हैं तो आप कीवर्ड तर्क भी प्रदान कर सकते हैं । डोकस्ट्रिंग देखें ।


5
संभवतः ध्यान देने योग्य बात यह है कि df.drop_duplicates()डिफ़ॉल्ट रूप से एक inplace पद्धति नहीं है, इसलिए एक नया DataFrame ( dfअपरिवर्तित छोड़कर ) लौटाता है । यह काफी मानक व्यवहार है, लेकिन अभी भी उपयोगी बिंदु हो सकता है।
खाली करें

14

मैंने अलग-अलग उपाय आजमाए हैं। पहले था:

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

और यह ऑब्जेक्ट डेटा नहीं करने के लिए अच्छी तरह से काम करता है ऐसा करने का एक और तरीका है और त्रुटि से बचने के लिए (ऑब्जेक्ट कॉलम प्रकार के लिए) drop_duplication () लागू करना है

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

आप ऐसा करने के लिए SQL का उपयोग भी कर सकते हैं, लेकिन इसने मेरे मामले में बहुत धीमी गति से काम किया:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)

7

uniqueडीएफ के लिए कोई विधि नहीं है , यदि प्रत्येक कॉलम के लिए अद्वितीय मानों की संख्या समान थी, तो निम्नलिखित काम करेगा: df.apply(pd.Series.unique)लेकिन यदि नहीं तो आपको एक त्रुटि मिलेगी। एक अन्य दृष्टिकोण में मूल्यों को स्टोर करने के लिए होगा, जो स्तंभ नाम पर कुंजीबद्ध है:

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}

क्या कई स्तंभों के लिए अद्वितीय की जांच करना संभव है?
अनूप डी।

एक और SO प्रश्न का उत्तर सुन्न का उपयोग करके मिलाnp.unique(df[['column1','column2']].values)
अनूप डी।

6

इसी तरह की समस्या को हल करने के लिए, मैं उपयोग कर रहा हूं groupby:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

क्या यह उपयुक्त है, इस पर निर्भर करेगा कि आप परिणाम के साथ क्या करना चाहते हैं, हालांकि (मेरे मामले में, मैं सिर्फ COUNT DISTINCTदिखाए गए के बराबर चाहता था )।



-1

आप कॉलम के सेट ले सकते हैं और छोटे सेट को बड़े सेट से घटा सकते हैं:

distinct_values = set(df['a'])-set(df['b'])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.