2016-09-09 20 views
6

Ảnh chụp màn hình của truy vấn dưới đây:Pandas: Có cách nào để sử dụng cái gì đó như 'droplevel' và trong quá trình, đổi tên cấp độ khác bằng cách sử dụng các nhãn mức giảm xuống dưới dạng tiền tố/hậu tố?

Groupby Query

Có cách nào để dễ dàng thả các chỉ số cột tầng trên và có một mức duy nhất với nhãn như points_prev_amax, points_prev_amin, gf_prev_amax, gf_prev_amin và vân vân?

Trả lời

6

Sử dụng list comprehension cho thiết lập tên cột mới:

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

Or: 

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

mẫu:

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 

Nếu cần prefix mục trao đổi đơn giản của các bộ:

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 

Một giải pháp:

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 

Nếu len của cột là lớn (10^6), sau đó thay vì sử dụng to_seriesstr.join:

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

Sử dụng thiết lập @ jezrael của

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

Gán cột mới với

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 Đây là một cái mới tôi đến với ngày nay ;-) hiểu vẫn nhanh hơn một chút. – piRSquared

+0

Tôi nghĩ rằng có một ngoại lệ - nếu len cột là rất lớn (vài 10^6), thì đây là nhanh hơn. 'df.columns = df.columns.to_series(). str.join ('_')'. Nhưng tôi nghĩ rằng thực tế len của 'cột' là nhỏ, do đó, danh sách hiểu là tốt hơn. – jezrael

+0

@jezrael nó cũng nhanh hơn khi có nhiều cấp độ hơn. 'pd.MultiIndex.from_product ([danh sách ('ABCD'), phạm vi (4), danh sách ('wxyz')])' – piRSquared

Các vấn đề liên quan