2016-09-09 48 views

Odpowiedz

6

Zastosowanie list comprehension dla określonych nowych nazw kolumn:

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

Or: 

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

Próbka:

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 

Jeśli potrzebujesz prefix proste elementy wymienne krotek:

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 

Innym rozwiązaniem:

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 

Jeśli len kolumn jest duża (10^6), wówczas raczej używać to_series i str.join:

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

Korzystanie konfiguracja @ jezrael za

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]) 

Przypisywanie nowe kolumny z

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 Jest to nowy wpadłem dzisiaj ;-) zrozumieniem wciąż nieco szybciej. – piRSquared

+0

Myślę, że jest jeden wyjątek - jeśli len kolumn jest bardzo duży (kilka 10^6), to jest to szybsze. 'df.columns = df.columns.to_series(). str.join ('_')'. Ale myślę, że praktycznie len z "kolumn" jest mały, więc zrozumienie listy jest lepsze. – jezrael

+0

@jezrael jest również szybszy, gdy jest więcej poziomów. 'pd.MultiIndex.from_product ([lista ('ABCD'), zakres (4), lista ('wxyz')])' – piRSquared