2017-09-27 72 views
2

GROUPBY列后缀给定一个数据帧大熊猫

 val1_aa val1_bb val2_aa val2_bb val2_cc val3_cc 
id              
100  6  0  3  4  3  1 
200  0  1  0  0  1  0 
300  5  1  1  0  4  0 
400  0  3  1  5  7  1 

我想总结在每个列标题的后缀的顺序排列的所有列。我想要的输出:

 aa bb cc 
id    
100 9 4 4 
200 0 1 1 
300 6 1 4 
400 1 8 8 

我该如何得到这个?


回答下面发布。

回答

2

你可以groupby与功能3210

In [4178]: df.groupby(lambda x: x.split('_')[-1], axis=1).sum() # or x.split('_')[1] 
Out[4178]: 
    aa bb cc 
id 
100 9 4 4 
200 0 1 1 
300 6 1 4 
400 1 8 8 
+1

很酷!我不知道'groupby'可能需要一个lambda。这教会了我新的东西。 –

+1

是的,'by'可以是'mapping,function,str或iterable' – Zero

1

这可以在列上使用groupby

x.groupby(x.columns.str.split('_').str[1], axis=1).sum() 

x 
    val1_aa val1_bb val2_aa val2_bb val2_cc val3_cc 
id              
100  6  0  3  4  3  1 
200  0  1  0  0  1  0 
300  5  1  1  0  4  0 
400  0  3  1  5  7  1 

x.columns.str.split('_').str[1] 
Index(['aa', 'bb', 'aa', 'bb', 'cc', 'cc'], dtype='object') 

y = x.groupby(x.columns.str.split('_').str[1], axis=1).sum() 

y 
    aa bb cc 
id    
100 9 4 4 
200 0 1 1 
300 6 1 4 
400 1 8 8 
3

您可以使用extract

df = df.groupby(df.columns.str.extract('_(.*)', expand=False), axis=1).sum() 
print (df) 
    aa bb cc 
id    
100 9 4 4 
200 0 1 1 
300 6 1 4 
400 1 8 8 

另一种解决方案与MultiIndex

df.columns = df.columns.str.split('_', expand=True) 
print (df) 
    val1 val2  val3 
     aa bb aa bb cc cc 
id       
100 6 0 3 4 3 1 
200 0 1 0 0 1 0 
300 5 1 1 0 4 0 
400 0 3 1 5 7 1 

df = df.groupby(level=1, axis=1).sum() 
print (df) 
    aa bb cc 
id    
100 9 4 4 
200 0 1 1 
300 6 1 4 
400 1 8 8