Pandas整理数据,从一列分散变量,从另一列收集变量
我的问题
我需要将下面的数据帧转换为tidy
格式,其中每一行都是一个惟一的['GEOG_CODE','COUNTRY']
- 'YEAR'
对,并且有两个变量,由Group1
定义。
使用Hadley Wickham的符号表示tidy data
Group1
['2016' '2017' '2018']
.中存储不同年份的值<>E217
在R中,我想:
gather
['2016' '2017' '2018']
.spread
Group1
.中的值来自列的值
对于我的问题:
['GEOG_CODE','COUNTRY']
.
['2016' '2017' '2018']
.
Group1 == A
或Group1 == B
.are defined列中的
我想让每一行作为一个位置-时间对,有两个变量。一个用于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()
通过使用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
发布于 2019-03-25 08:31:35
也许您正在寻找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
https://stackoverflow.com/questions/55329764
复制相似问题