首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从熊猫数据中提取多行并转换为列

从熊猫数据中提取多行并转换为列
EN

Stack Overflow用户
提问于 2015-11-23 23:19:06
回答 1查看 1.2K关注 0票数 1

我想要改变福利。数据文件:

代码语言:javascript
复制
    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值,即YR 2008和2013年的1和10,这样我就可以得到如下内容:

代码语言:javascript
复制
index    BIOM_2008     BIOM_2013    site
0         0.53         26.65        1
1         26.65        29.72        10

这就是我要做的:

代码语言:javascript
复制
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循环正确。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-23 23:54:20

我不确定你在这里需要一个循环。您可以简单地创建所需数据的一部分,设置索引,然后按如下方式展开:

代码语言:javascript
复制
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')

它提供了以下内容:

代码语言:javascript
复制
      BIOM       
YR    2008   2013
site             
1     0.53  26.65
10    0.39    NaN

为了响应您的评论,要将分层列索引扁平化,请执行以下操作:

代码语言:javascript
复制
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

这可能比你最初的循环想法更复杂,但我认为它以更复杂的方式使用熊猫的功能。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33882642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档