熊猫整齐的数据,从一列中分散变量,从另一列中收集
我需要将下面的数据框转换为tidy
格式,其中每一行都是唯一的['GEOG_CODE','COUNTRY']
-'YEAR'
配对,并且有两个变量,分别由{{1 }}。
使用Hadley Wickham的tidy data表示法:
Group1
Group1
列中的不同年份。在R中,我想:
['2016' '2017' '2018']
列gather
中的值。['2016' '2017' '2018']
中来自spread
的值。对于我的问题:
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()
答案 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