首页 > 解决方案 > 熊猫,堆叠一些列,取消堆叠一些其他的

问题描述

Pandas 整理数据,从一列传播变量,从另一列收集

我的问题

我需要将下面的数据框转换为一种tidy格式,其中每一行都是唯一的['GEOG_CODE','COUNTRY']配对'YEAR',并且有两个变量,由Group1.

使用 Hadley Wickham 的符号来整理数据

整洁的数据语义

在 RI 中希望:

对于我的问题:

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

 我有这个

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'

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

我设法通过使用融化功能获得了一半的数据,但后来我不知道如何将组变成行。

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

标签: pythonpython-3.xpandas

解决方案


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

(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

推荐阅读