2015-10-17 14 views
7

पांडस 0.17 में पदानुक्रम सूचकांक (ए और बी) को बनाए रखते हुए मैं एक विशिष्ट कॉलम द्वारा सॉर्ट करने का प्रयास करता हूं। बी एक चलती संख्या है जो concatenation के माध्यम से डेटा फ्रेम स्थापित करते समय बनाया गया है। मेरे डेटा इस तरह दिखता है:पाइंडन पांडस मल्टीइंडेक्स और कॉलम द्वारा क्रमबद्ध

  C  D 
A B 
bar two dull 5 
    three glossy 8 
    one shiny 10 
foo one dull 3 
    three matt 12 
    two shiny 9 

नीचे कोड मैं उपयोग कर रहा हूँ और परिणाम है:

  C  D 
A B 
bar one shiny 10 
    two dull 5 
    three glossy 8 
foo one dull 3 
    two shiny 9 
    three matt 12 

यह मैं क्या जरूरत है। नोट: पांडस 0.17 अलर्ट्स कि dataframe.sort को बहिष्कृत किया जाएगा। इसी तरह

df.sort_values(by="C", ascending=True).groupby(axis=0, level=0, as_index=True) 

, पहले सूचकांक छँटाई का उपयोग करने जा, और फिर GroupBy स्तंभ नहीं उपयोगी है:

df.sort_values(by="C", ascending=True) 
      C  D 
A B 
bar two dull 5 
foo one dull 3 
bar three glossy 8 
foo three matt 12 
bar one shiny 10 
foo two shiny 9 

जोड़ना .groupby एक ही परिणाम का उत्पादन नहीं

df.sort_index(axis=0, level=0, as_index=True).groupby(C, as_index=True) 

मैं कर रहा हूँ कुछ रीइंडेक्सिंग के बारे में मुझे पहली इंडेक्स ए रखने की जरूरत है, दूसरी इंडेक्स बी को फिर से सौंप दिया जा सकता है, लेकिन इसे नहीं करना है। अगर कोई आसान समाधान नहीं है तो यह मुझे आश्चर्यचकित करेगा; मुझे लगता है मुझे बस यह नहीं मिला। किसी भी सुझाव की सराहना की जाती है।


संपादित करें: इस बीच मैं दूसरा सूचकांक बी गिरा में, पुन: असाइन पहले सूचकांक एक एक स्तंभ के बजाय एक सूचकांक एकाधिक स्तंभों हल कर सकता है, तो फिर से इंडैक्स:

df.index = df.index.droplevel(1) 
df.reset_index(level=0, inplace=True) 
df_sorted = df.sort_values(["A", "C"], ascending=[1,1]) #A is a column here, not an index. 
df_reindexed = df_sorted.set_index("A") 
बहुत

फिर भी वर्बोज़।

उत्तर

6

Feels की तरह वहाँ एक बेहतर तरीका हो सकता है, लेकिन यहाँ एक दृष्टिकोण है:

In [163]: def sorter(sub_df): 
    ...:  sub_df = sub_df.sort_values('C') 
    ...:  sub_df.index = sub_df.index.droplevel(0) 
    ...:  return sub_df 

In [164]: df.groupby(level='A').apply(sorter) 
Out[164]: 
       C D 
A B     
bar two  dull 5 
    three glossy 8 
    one  shiny 10 
foo one  dull 3 
    three matt 12 
    two  shiny 9 
+0

आपका दृष्टिकोण मेरे मध्यवर्ती समाधान से अधिक उन्नत है, लेकिन मैं मानता हूं कि एक बेहतर तरीका होना चाहिए। – raummensch

1

chrisb के कोड के आधार पर:

ध्यान दें कि मेरे मामले में, यह एक श्रृंखला नहीं एक DataFrame है,

s.groupby(level='A', group_keys=False).apply(lambda x: x.sort_values(ascending=False)) 
संबंधित मुद्दे