python - 熊猫,堆叠一些列,取消堆叠一些其他的
问题描述
Pandas 整理数据,从一列传播变量,从另一列收集
我的问题
我需要将下面的数据框转换为一种tidy
格式,其中每一行都是唯一的['GEOG_CODE','COUNTRY']
配对'YEAR'
,并且有两个变量,由Group1
.
使用 Hadley Wickham 的符号来整理数据:
- 观察结果由位置-时间配对定义。
- 变量由列定义
Group1
- 这些值当前存储在列中的不同年份
['2016' '2017' '2018']
。
在 RI 中希望:
gather
列中的值['2016' '2017' '2018']
。spread
的值Group1
。- 在此处查看Garrett Grolemund 的解释
对于我的问题:
- 位置由
['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()
我设法通过使用融化功能获得了一半的数据,但后来我不知道如何将组变成行。
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
解决方案
也许您正在寻找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
推荐阅读
- mongodb - 是否可以在只读模式下通过 mongo shell 连接?
- laravel - Jenssegers\Mongodb hasMany to hasMany 关系
- python - 根据 Pandas 中的特定列连接不同长度的列
- amazon-web-services - AWS ECS 任务容器
- c# - 在具有多个连接 EF 的 Linq 查询中计数
- javascript - 如何在 HTML 中获取网络请求 URL 列表(浏览器背景)
- mysql - 需要帮助 MySQL 查询
- trace - 带有 Microprofile OpenTracing 分布式跟踪的 Quarkus 不起作用
- batch-file - 如果子文件夹中的文件被修改,则将文件从一个文件夹复制到另一个文件夹
- windows - Edge-Chromium - 代理服务器的注册表设置无法立即工作