首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pandas,堆叠一些列,取消堆叠其他列

Pandas,堆叠一些列,取消堆叠其他列
EN

Stack Overflow用户
提问于 2019-03-25 08:04:30
回答 1查看 2K关注 0票数 2

Pandas整理数据,从一列分散变量,从另一列收集变量

我的问题

我需要将下面的数据帧转换为tidy格式,其中每一行都是一个惟一的['GEOG_CODE','COUNTRY'] - 'YEAR'对,并且有两个变量,由Group1定义。

使用Hadley Wickham的符号表示tidy data

  • observations由位置-时间对定义。
  • variablesGroup1
  • The列定义。当前在列['2016' '2017' '2018'].

中存储不同年份的值<>E217

在R中,我想:

中的值来自列的值

对于我的问题:

['GEOG_CODE','COUNTRY'].

  • Values在不同时间定义['2016' '2017' '2018'].

  • Variables are defined by Group1 == AGroup1 == B.

are defined列中的

  • 位置

我想让每一行作为一个位置-时间对,有两个变量。一个用于Group1 = A,一个用于Group1 = B

我有这个

代码语言:javascript
复制
toy_data = {
    'GEOG_CODE':['123','234','567','901'],
    'COUNTRY':['England' for _ in range(4)],
    'Group1':['A','A','B','B'],
    '2016':np.arange(0,4),
    '2017':np.arange(0,4),
    '2018':np.arange(0,4),
}
in_df = pd.DataFrame(toy_data)
in_df

Out[]:
GEOG_CODE  COUNTRY Group1  2016  2017  2018
0       123  England      A     0     0     0
1       234  England      A     1     1     1
2       567  England      B     2     2     2
3       901  England      B     3     3     3

我想要这个

因此,我希望输出看起来像下面的数据框,其中包含'Group1'中每个值的列

代码语言:javascript
复制
outcome_data = {
    'GEOG_CODE': np.tile(['123','234','567','901'],3),
    'COUNTRY':['England' for _ in range(4*3)],
    'year':np.tile([2016,2017,2018],4),
    'low_A':np.tile(np.arange(0,4),3),
    'low_B':np.tile(np.arange(0,4),3),
}

out = pd.DataFrame(outcome_data)
out

Out[]:
GEOG_CODE  COUNTRY  year  low_A  low_B
0        123  England  2016      0      0
1        234  England  2017      1      1
2        567  England  2018      2      2
3        901  England  2016      3      3
4        123  England  2017      0      0
5        234  England  2018      1      1
6        567  England  2016      2      2
7        901  England  2017      3      3
8        123  England  2018      0      0
9        234  England  2016      1      1
10       567  England  2017      2      2
11       901  England  2018      3      3

我尝试过df.melt()

通过使用melt功能,我设法获得了一半的数据,但是我不知道如何将组转换为行。

代码语言:javascript
复制
id_vars = ['GEOG_CODE', 'COUNTRY', 'Group1']
value_vars = ['2016', '2017', '2018']
var_name = 'Year'
value_name = 'low_Value'

melt = in_df.melt(id_vars=id_vars,value_vars=value_vars,var_name=var_name, value_name=value_name)
melt

Out[]:
GEOG_CODE  COUNTRY Group1  Year  low_Value
0        123  England      A  2016          0
1        234  England      A  2016          1
2        567  England      B  2016          2
3        901  England      B  2016          3
4        123  England      A  2017          0
5        234  England      A  2017          1
6        567  England      B  2017          2
7        901  England      B  2017          3
8        123  England      A  2018          0
9        234  England      A  2018          1
10       567  England      B  2018          2
11       901  England      B  2018          3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 08:31:35

也许您正在寻找stack而不是melt

代码语言:javascript
复制
(df.set_index(['GEOG_CODE', 'COUNTRY', 'Group1'])
   .stack()
   .unstack(-2)
   .ffill(axis=1)
   .bfill(axis=1, downcast='infer')
   .add_prefix('low_')
   .reset_index()
   .rename({'level_2': 'year'}, axis=1))

Group1 GEOG_CODE  COUNTRY  year  low_A  low_B
0            123  England  2016      0      0
1            123  England  2017      0      0
2            123  England  2018      0      0
3            234  England  2016      1      1
4            234  England  2017      1      1
5            234  England  2018      1      1
6            567  England  2016      2      2
7            567  England  2017      2      2
8            567  England  2018      2      2
9            901  England  2016      3      3
10           901  England  2017      3      3
11           901  England  2018      3      3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55329764

复制
相关文章

相似问题

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