2016-09-09 21 views
6

नीचे क्वेरी का स्क्रीनशॉट:पांडा: क्या 'बूंदवेल' जैसी प्रक्रिया का उपयोग करने का कोई तरीका है और प्रक्रिया में, गिराए गए स्तर लेबल का उपयोग उपसर्ग/प्रत्यय के रूप में दूसरे स्तर का नाम बदलें?

Groupby Query

वहाँ एक रास्ता आसानी से ऊपरी स्तर स्तंभ अनुक्रमणिका और इस तरह के points_prev_amax, points_prev_amin, gf_prev_amax, gf_prev_amin और इतने पर के रूप में लेबल के साथ एक एक एकल स्तर है ड्रॉप करने है?

उत्तर

6

उपयोग list comprehension सेट नया स्तंभ नाम के लिए:

df.columns = df.columns.map('_'.join) 

Or: 

df.columns = ['_'.join(col) for col in df.columns] 

नमूना:

df = pd.DataFrame({'A':[1,2,2,1], 
        'B':[4,5,6,4], 
        'C':[7,8,9,1], 
        'D':[1,3,5,9]}) 

print (df) 
    A B C D 
0 1 4 7 1 
1 2 5 8 3 
2 2 6 9 5 
3 1 4 1 9 

df = df.groupby('A').agg([max, min]) 

df.columns = df.columns.map('_'.join) 
print (df) 
    B_max B_min C_max C_min D_max D_min 
A           
1  4  4  7  1  9  1 
2  6  5  9  8  5  3 

print (['_'.join(col) for col in df.columns]) 
['B_max', 'B_min', 'C_max', 'C_min', 'D_max', 'D_min'] 

df.columns = ['_'.join(col) for col in df.columns] 
print (df) 
    B_max B_min C_max C_min D_max D_min 
A           
1  4  4  7  1  9  1 
2  6  5  9  8  5  3 

अगर जरूरत prefix tuples के सरल स्वैप आइटम:

df.columns = ['_'.join((col[1], col[0])) for col in df.columns] 
print (df) 
    max_B min_B max_C min_C max_D min_D 
A           
1  4  4  7  1  9  1 
2  6  5  9  8  5  3 

एक अन्य समाधान:

df.columns = ['{}_{}'.format(i[1], i[0]) for i in df.columns] 
print (df) 
    max_B min_B max_C min_C max_D min_D 
A           
1  4  4  7  1  9  1 
2  6  5  9  8  5  3 

तो स्तंभों की len बड़ा है (10^6), तो बजाय to_series और str.join का उपयोग करें:

df.columns = df.columns.to_series().str.join('_') 
2

@ jezrael का सेटअप का उपयोग करना

df = pd.DataFrame({'A':[1,2,2,1], 
        'B':[4,5,6,4], 
        'C':[7,8,9,1], 
        'D':[1,3,5,9]}) 

df = df.groupby('A').agg([max, min]) 

from itertools import starmap 

def flat(midx, sep=''): 
    fstr = sep.join(['{}'] * midx.nlevels) 
    return pd.Index(starmap(fstr.format, midx)) 

df.columns = flat(df.columns, '_') 

df 

enter image description here

+0

साथ नए कॉलम निरुपित @jezrael यह अभी भी थोड़ा तेज है एक नया एक मैं आज ;-) समझ के साथ आया है। – piRSquared

+0

मुझे लगता है कि एक अपवाद है - यदि कॉलम का लेन बहुत बड़ा है (कुछ 10^6), तो यह तेज़ है। 'df.columns = df.columns.to_series()। str.join ('_')'। लेकिन मुझे लगता है कि व्यावहारिक रूप से 'कॉलम' का लेनदेन छोटा है, इसलिए सूची समझ बेहतर है। – jezrael

+0

@jezrael यह अधिक तेज़ होने पर भी तेज़ है। 'pd.MultiIndex.from_product ([सूची ('एबीसीडी'), रेंज (4), सूची ('wxyz')]) – piRSquared

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