2013-11-25 11 views
20

डेटाफ्रेम को देखते हुए, मैं डुप्लीकेट इंडेक्स प्राप्त करना चाहता हूं, जिसमें कॉलम में डुप्लिकेट मान नहीं हैं, और देखें कि कौन से मान अलग हैं।पांडा: डुप्लीकेट इंडेक्स प्राप्त करें

विशेष रूप से, मैं इस dataframe है:

import pandas as pd 
wget https://www.dropbox.com/s/vmimze2g4lt4ud3/alt_exon_repeatmasker_intersect.bed 
alt_exon_repeatmasker = pd.read_table('alt_exon_repeatmasker_intersect.bed', header=None, index_col=3) 

In [74]: alt_exon_repeatmasker.index.is_unique 
Out[74]: False 

और अनुक्रमित के कुछ 9 स्तंभ (इस स्थान में डीएनए दोहराव तत्व के प्रकार) में डुप्लिकेट मानों है, और मुझे पता है कि कर रहे हैं चाहते हैं अलग-अलग स्थानों के लिए दोहराए जाने वाले तत्वों के विभिन्न प्रकार (प्रत्येक अनुक्रमणिका = एक जीनोम स्थान)।

मुझे लगता है कि इसे किसी प्रकार की groupby की आवश्यकता होगी और उम्मीद है कि कुछ groupby निंजा मेरी मदद कर सकता है।

आगे भी आसान बनाने के लिए, अगर हम केवल सूचकांक और दोहराने प्रकार है,

genome_location1 MIR3 
genome_location1 AluJb 
genome_location2 Tigger1 
genome_location3 AT_rich 

तो उत्पादन मैंने सभी डुप्लिकेट अनुक्रमित और उनके दोहराने प्रकार देखने के लिए, इस तरह के रूप चाहते हैं:

genome_location1 MIR3 
genome_location1 AluJb 

संपादित करें: जोड़ा खिलौना उदाहरण

+1

हाय, आम तौर पर यह जितना संभव हो उतना सवाल को आसान बनाने और इनपुट और वांछित उत्पादन के साथ खिलौना उदाहरण बनाने के लिए अच्छी आदत है। इस तरह के एक प्रश्न का उत्तर बहुत तेज है और भविष्य के पाठकों के लिए उपयोगी होगा। –

उत्तर

14
df.groupby(level=0).filter(lambda x: len(x) > 1)['type'] 

हमने इस तरह के ऑपरेशन के लिए filter विधि जोड़ा। आप मास्किंग का उपयोग भी कर सकते हैं और बराबर परिणामों के लिए बदल सकते हैं, लेकिन यह तेज़ है, और थोड़ा और भी पठनीय है।

महत्वपूर्ण:

filter विधि संस्करण 0.12 में पेश किया गया था, लेकिन उस पर nonunique सूचकांक DataFrames/सीरीज काम करने में विफल। मुद्दा - और श्रृंखला पर transform के साथ एक संबंधित समस्या - संस्करण 0.13 के लिए तय किया गया था, जिसे किसी भी दिन जारी किया जाना चाहिए।

स्पष्ट रूप से, nonunique इंडेक्स इस सवाल का दिल हैं, इसलिए मुझे यह इंगित करना चाहिए कि जब तक आपके पास पांडा 0.13 नहीं है तब तक यह दृष्टिकोण आपकी सहायता नहीं करेगा। इस बीच, transform कामकाज जाने का रास्ता है। सावधान रहें कि अगर आप श्रृंखला पर एक गैर-यूनिक इंडेक्स के साथ प्रयास करते हैं, तो यह भी असफल हो जाएगा।

कोई अच्छा कारण नहीं है कि filter और transform गैर-यूनिक इंडेक्स पर लागू नहीं होना चाहिए; इसे पहले खराब तरीके से लागू किया गया था।

+0

+1 फ़िल्टर विधि –

+0

के बारे में नहीं पता था यह मेरे लिए काम नहीं कर रहा है, मैंने कोशिश की है कि 'df.groupby (level = 0)। फिल्टर (लैम्ब्डा एक्स: ट्रू)', 'अपवाद प्राप्त करना: केवल रेन्डेक्सिंग केवल वैध विशिष्ट मूल्यवान सूचकांक वस्तुओं के साथ। –

+0

अच्छा पकड़ो! यह विशेष उपयोग v0.13 के लिए तय किया गया एक बग का सामना करता है, जो स्पष्ट रूप से कई उपयोगकर्ताओं के पास नहीं है। उत्तर अपडेट किया गया। –

7
>>> df[df.groupby(level=0).transform(len)['type'] > 1] 
        type 
genome_location1 MIR3 
genome_location1 AluJb 
+3

या, इसी तरह, '' filter'' के साथ इसी प्रकार: 'df.groupby (level = 0)। फ़िल्टर (लैम्ब्डा x: लेन (x)> 1) ['type']' '। बदलने और मास्किंग से तेज़ होगा। –

+0

@DanAllan महान, क्या आप एक और जवाब जोड़ सकते हैं और OP इसे स्वीकार करेंगे? –

+0

धन्यवाद! मैं इस जवाब को स्वीकार करूंगा क्योंकि यह 'पांडा' की वर्तमान रिलीज के साथ काम करने की गारंटी है। –

1

अधिक संक्षेप:

df[df.groupby(level=0).type.count() > 1] 

FYI एक बहु सूचकांक:

df[df.groupby(level=[0,1]).type.count() > 1] 
9

इसके अलावा उपयोगी और बहुत संक्षिप्त:

df[df.index.duplicated()]

ध्यान दें कि यह केवल में से एक रिटर्न डुप्लिकेट पंक्तियां, इसलिए सभी डुप्लिकेट पंक्तियों को देखने के लिए आप यह चाहते हैं:

df[df.index.duplicated(keep=False)]

7

यहां तक ​​कि तेजी से और बेहतर:

df.index.get_duplicates() 
संबंधित मुद्दे