熊猫,堆叠一些列,堆叠其他列

时间:2019-03-25 00:04:30

标签: python python-3.x pandas

熊猫整齐的数据,从一列中分散变量,从另一列中收集

我的问题

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

使用Hadley Wickham的tidy data表示法:

  • 观测是由“位置时间”配对定义的。
  • 变量由列Group1
  • 定义
  • 当前存储在Group1列中的不同年份。

Tidy Data Semantics

在R中,我想:

对于我的问题:

  • 位置Group1定义。
  • ['GEOG_CODE','COUNTRY']列中定义了
  • 在不同时间。
  • 变量['2016' '2017' '2018']Group1 == A定义。

我希望每一行都具有两个位置变量,作为位置时间对。一个用于Group1 == B,一个用于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()

1 个答案:

答案 0 :(得分:1)

也许您正在寻找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