2015-02-26 15 views
10

कहें df एक पांडा डेटाफ्रेम है। इंडेक्सिंग पांडस डेटा फ्रेम: पूर्णांक पंक्तियां, कॉलम नाम

जब पंक्तियों को संदर्भित, df.ix[row_idx, ] केवल नाम दिया जाना चाहता है:

  • df.loc[] केवल केवल पूर्णांकों (वास्तविक प्लेसमेंट)
  • df.ix[] दोनों के नाम और पूर्णांकों स्वीकार करता है स्वीकार करता है नाम
  • df.iloc[] स्वीकार करता है। जैसे

    df = pd.DataFrame({'a' : ['one', 'two', 'three','four', 'five', 'six'], 
            '1' : np.arange(6)}) 
    df = df.ix[2:6] 
    print(df) 
    
        1  a 
    2 2 three 
    3 3 four 
    4 4 five 
    5 5 six 
    
    df.ix[0, 'a'] 
    

    एक त्रुटि फेंकता है, यह 'दो' वापस नहीं देता है।

    कॉलम का संदर्भ देते समय, इलोक पूर्णांक पसंद करता है, नाम नहीं। जैसे

    df.ix[2, 1] 
    

    रिटर्न 'तीन', नहीं 2. (df.idx[2, '1'] हालांकि वापसी करता 2)।

    विचित्र रूप से, मुझे सटीक विपरीत कार्यक्षमता चाहिए। आम तौर पर मेरे कॉलम नाम बहुत सार्थक होते हैं, इसलिए मेरे कोड में मैं उन्हें सीधे संदर्भित करता हूं। लेकिन बहुत से अवलोकन की सफाई के कारण, मेरे पांडा डेटा फ्रेम में पंक्ति नाम आमतौर पर range(len(df)) से मेल नहीं खाते हैं।

    मुझे पता है मैं उपयोग कर सकते हैं:

    df.iloc[0].loc['a'] # returns three 
    

    लेकिन यह बदसूरत लगता है! क्या किसी को ऐसा करने का बेहतर तरीका पता है, ताकि कोड इस तरह दिखेगा?

    df.foo[0, 'a'] # returns three 
    

    वास्तव में, pandas.core.frame.DataFrame रों को अपने ही नई विधि पर जोड़ने के लिए है, तो उदाहरण के लिए यह संभव है df.idx(rows, cols) वास्तव में df.iloc[rows].loc[cols] है?

+1

आप 'df ['a'] का उपयोग कर सकते हैं। Iloc [0]'। – unutbu

+6

यह भी देखें [जीएच 9213] (https://github.com/pydata/pandas/issues/9213#issuecomment-72076683), जो 'df.loc [df.index [0],' a ']' का सुझाव देता है। इसमें [जंजीर अनुक्रमण का उपयोग न करने का लाभ] है (http://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-the-assignment-when-using-chained-indexing-fail) , जिसका अर्थ यह है कि यह कार्य करते समय काम करेगा, जबकि 'डीएफ [[' ए ',' बी ']]। iloc [0] = val' नहीं होगा। – unutbu

+0

वास्तव में आपकी समस्या का समाधान नहीं करता है लेकिन यहां बहुत अच्छा जवाब है: https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation – JohnE

उत्तर

8

यह देर से उत्तर है, लेकिन @ unutbu की टिप्पणी अभी भी मान्य है और इस समस्या का एक बड़ा समाधान है।

सूचकांक करने के लिए

पूर्णांक पंक्तियों और नाम कॉलम (लेबल कॉलम) के साथ एक DataFrame:

df.loc[df.index[#], 'NAME'] जहां # एक मान्य पूर्णांक सूचकांक है और NAME स्तंभ का नाम है।

+0

लंबे डेटाफ्रेम पर बहुत धीमी लगती है। – ConanG

संबंधित मुद्दे