2015-11-23 126 views
1

我想转换foll。据帧:从熊猫数据框中提取多行并转换为列

index YR BIOM RWT site 
0  0 2008 0.53 0.20 1 
1  1 2009 3.23 1.18 1 
2  2 2010 11.51 3.94 1 
3  3 2011 18.14 5.82 1 
4  4 2012 22.88 6.73 1 
5  5 2013 26.65 7.20 1 
6  0 2008 0.39 0.15 10 
7  1 2009 2.43 0.90 10 
8  2 2010 8.95 3.09 10 
9  3 2011 16.63 5.38 10 
10  4 2012 24.36 7.23 10 
11  5 2013 29.72 8.10 10 

我想提取BIOM值的2独特site即1和10的YR 2008年和2013年,使我得到这样的:

index BIOM_2008  BIOM_2013 site 
0   0.53   26.65  1 
1   26.65  29.72  10 

这是什么我在做:

lst_yrs = [2008, 2013] 
sub_df = df[['YR', 'BIOM', 'site']] 

for yr in lst_yrs: 
    sub_df['BIOM'+str(yr)] = sub_df.loc['YR' == yr] 

不知道如何获得for循环的权利。

+0

看看这个: http://stackoverflow.com/questions/29941384/how-can-i-use-melt-to-reshape-a-pandas-dataframe-to-a-list-creating- an-index – toasteez

回答

1

我不确定你需要在这里循环。你可以简单地创建所需的数据的切片,设置索引,然后拆散如下:

import pandas as pd 

DF = pd.DataFrame({ 
'site' : [1, 1, 1, 1, 1, 1, 10, 10, 10], 
'BIOM' : [0.53, 3.23, 11.51, 18.14, 22.88, 26.65, 0.39, 2.43, 8.95], 
'YR' : ['2008', '2009', '2010', '2011', '2012', '2013', '2008', '2009', '2010'] 
        }) 

slice = DF[(DF['site'].isin([1, 10]) & DF['YR'].isin(['2008', '2013']))] 

result = slice.set_index(['site','YR']).unstack('YR') 

其中给出以下几点:

 BIOM  
YR 2008 2013 
site    
1  0.53 26.65 
10 0.39 NaN 

在回答您的意见,扁平化层级列索引做到以下几点:

result.columns = [' '.join(col).strip() for col in result.columns.values] 


    site BIOM 2008 BIOM 2013 
0  1  0.53  26.65 
1 10  0.39  NaN 

可能这是现在比你原来的想法循环更加复杂,但我认为它使用的大熊猫功能更复杂的方式。

+0

谢谢@WoodyPride,这看起来不错。如何将其转换为我需要的格式(如上面的问题)? – user308827

相关问题