2016-08-16 9 views
9
को transposing

अगर मैं एक साधारण dataframe है:पांडा पंक्तियों पर बहु ​​सूचकांक की स्थापना, फिर कॉलम

print(a) 

    one two three 
0 A 1  a 
1 A 2  b 
2 B 1  c 
3 B 2  d 
4 C 1  e 
5 C 2  f 

मैं आसानी से जारी करके पंक्तियों पर एक बहु सूचकांक बना सकते हैं:

a.set_index(['one', 'two']) 

     three 
one two  
A 1  a 
    2  b 
B 1  c 
    2  d 
C 1  e 
    2  f 

क्या स्तंभों पर बहु-अनुक्रमणिका बनाने का एक आसान तरीका है?

मैं अंत करना चाहते हैं:

one A  B  C 
    two 1 2 1 2 1 2 
    0 a b c d e f 

इस मामले में, यह बहुत पंक्ति बहु सूचकांक बनाने और उसके बाद स्थानांतरित यह आसान होगा, लेकिन अन्य उदाहरण में, मैं हो जाएगा पंक्तियों और स्तंभों दोनों पर एक बहु-सूचकांक बनाना चाहते हैं।

+0

यह (सूचकांक = 'एक' a.pivot की तरह दिखता है, कॉलम = 'दो', मान = 'तीन') जो मैं चाहता हूं उसके करीब हो रहा है (डीएफ से जानकारी निकालने और उन्हें कॉलम में बदलना), हालांकि मुझे बहु-सूचकांक बनाने का तरीका नहीं पता है। – sheridp

+0

मुझे नहीं लगता कि आप "कॉलम पर बहु-अनुक्रमणिका सेट करना" चाहते हैं, मुझे लगता है कि आप इसे पंक्तियों पर सेट करना चाहते हैं, फिर पंक्तियों को पंक्तियों में स्थानांतरित करना चाहते हैं? कृपया – smci

उत्तर

4

हाँ! इसे पारदर्शिता कहा जाता है।

a.set_index(['one', 'two']).T 

enter image description here


की क्योंकि वे के साथ प्रदर्शित करने के लिए एक बहुत अच्छा उदाहरण का इस्तेमाल किया @ ragesz पद से उधार हैं।

df = pd.DataFrame({'a':['foo_0', 'bar_0', 1, 2, 3], 'b':['foo_0', 'bar_1', 11, 12, 13], 
    'c':['foo_1', 'bar_0', 21, 22, 23], 'd':['foo_1', 'bar_1', 31, 32, 33]}) 

df.T.set_index([0, 1]).T 

enter image description here

+2

ओपी स्पष्ट होने के लिए अपना प्रश्न संपादित करें, ट्रांसपोज़ का उपयोग नहीं करना चाहते क्योंकि वे कॉलम और पंक्तियों पर बहु-अनुक्रमणिका चाहते हैं। – Merlin

+0

शायद एक '.reset_index (ड्रॉप = ट्रू)' पर और आवश्यक होगा, और एक नई पंक्ति में 'df.columns.name = [' first ',' second '] 'कॉलम हेडर का नाम बदलने के लिए। – ragesz

+0

@ मार्लिन यह ठीक है। आप set_index को तब ट्रांसफर कर सकते हैं, फिर set_index को ट्रांसफर करें। यदि ओपी ने एक उदाहरण दिया है तो वे दोनों के लिए चाहते हैं, मुझे यह दिखाने में खुशी है कि यह कैसे किया जाता है। मैं अभी एक कर दूंगा, लेकिन मुझे थोड़ी देर के लिए दौड़ना है। – piRSquared

0

मुझे लगता है कि संक्षिप्त उत्तर NO है। मल्टी-इंडेक्स कॉलम रखने के लिए, डेटाफ्रेम में हेडर में परिवर्तित होने के लिए दो (या अधिक) पंक्तियां होनी चाहिए (जैसे बहु-अनुक्रमणिका पंक्तियों के लिए कॉलम)। यदि आपके पास इस प्रकार का डेटाफ्रेम है, तो बहु-अनुक्रमणिका शीर्षलेख बनाना इतना कठिन नहीं है। यह कोड का एक बहुत ही लंबी लाइन में किया जा सकता है, और आप किसी भी अन्य dataframe में यह पुन: उपयोग कर सकते हैं, हेडर का ही पंक्ति संख्या मन & परिवर्तन में रखा जाना चाहिए, तो अलग है:

df = pd.DataFrame({'a':['foo_0', 'bar_0', 1, 2, 3], 'b':['foo_0', 'bar_1', 11, 12, 13], 
    'c':['foo_1', 'bar_0', 21, 22, 23], 'd':['foo_1', 'bar_1', 31, 32, 33]}) 

dataframe:

 a  b  c  d 
0 foo_0 foo_0 foo_1 foo_1 
1 bar_0 bar_1 bar_0 bar_1 
2  1  11  21  31 
3  2  12  22  32 
4  3  13  23  33 

बनाना बहु सूचकांक वस्तु:

arrays = [df.iloc[0].tolist(), df.iloc[1].tolist()] 
tuples = list(zip(*arrays)) 
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) 

df.columns = index 

मल्टी सूचकांक हैडर परिणाम:

शीर्ष लेख अनुक्रमित और dataframe ही निर्दिष्ट करने के लिए है

df = df.iloc[2:].reset_index(drop=True) 

"एक पंक्ति" संस्करण (केवल एक चीज आप बदलना होगा:

first foo_0   foo_1  
second bar_0 bar_1 bar_0 bar_1 
0  foo_0 foo_0 foo_1 foo_1 
1  bar_0 bar_1 bar_0 bar_1 
2   1  11  21  31 
3   2  12  22  32 
4   3  13  23  33 

अंत में हम तो पंक्ति सूचकांक रीसेट 0-1 पंक्तियों छोड़ने की ज़रूरत):

idx_first_header = 0 
idx_second_header = 1 

df.columns = pd.MultiIndex.from_tuples(list(zip(*[df.iloc[idx_first_header].tolist(), 
    df.iloc[idx_second_header].tolist()])), names=['first', 'second']) 

df = df.drop([idx_first_header, idx_second_header], axis=0).reset_index(drop=True) 
1

आप pivot_table dataframe पर जोड़तोड़ की एक श्रृंखला के बाद का उपयोग वांछित प्रपत्र प्राप्त करने के लिए कर सकते हैं:

df_pivot = pd.pivot_table(df, index=['one', 'two'], values='three', aggfunc=np.sum) 

def rename_duplicates(old_list): # Replace duplicates in the index with an empty string 
    seen = {} 
    for x in old_list: 
     if x in seen: 
      seen[x] += 1 
      yield " " 
     else: 
      seen[x] = 0 
      yield x 

col_group = df_pivot.unstack().stack().reset_index(level=-1) 
col_group.index = rename_duplicates(col_group.index.tolist()) 
col_group.index.name = df_pivot.index.names[0] 
col_group.T 

one A  B  C 
two 1 2 1 2 1 2 
0 a b c d e f 
संबंधित मुद्दे