python - 将数据框从长格式转换为宽格式并动态命名列
问题描述
我正在将数据框从长格式转换为宽格式,但是我面临的问题是生成正确数量的已翻译列并动态重命名新的数据框列。
因此,假设我有一个示例数据框,如下所示:
data = {'name':['Tom', 'nick', 'Tom', 'nick','Tom'], 'id':[20, 21, 20, 21,22], 'plan' : [100,101,102,101,100], 'drug' : ['a','b','b','c','a']}
df = pd.DataFrame(data)
drug id name plan
a 20 Tom 100
b 21 nick 101
b 20 Tom 102
c 21 nick 101
a 22 Tom 100
因此,对于每个给定的名称和 ID,我想为计划和药物创建多个列。例如,有 3 个不同的计划和 3 个不同的药物,所以理想情况下,我应该得到 6 个新列,指示是否已采取特定计划/药物。
我尝试从长转换为宽,但没有得到想要的结果。将长转换为宽:
df1 = df.groupby(['name','id'])['plan', 'drug'].apply(lambda x: pd.DataFrame(x.values)).unstack().reset_index()
实际输出:
name id 0 1 0 1
Tom 20 100 102 a b
nick 21 101 101 b c
Tom 22 100 None a None
预期输出:
name age 100 101 102 a b c
Tom 20 1 0 1 1 1 0
Tom 22 1 0 0 1 0 0
nick 21 0 1 0 0 1 1
解决方案
get_dummies
与 一起使用max
:
df1 = pd.get_dummies(df.set_index(['name','id']).astype(str)).max(level=[0,1]).reset_index()
print(df1)
name id plan_100 plan_101 plan_102 drug_a drug_b drug_c
0 Tom 20 1 0 1 1 1 0
1 nick 21 0 1 0 0 1 1
2 Tom 22 1 0 0 1 0 0
df2 = (pd.get_dummies(df.set_index(['name','id'])
.astype(str), prefix='', prefix_sep='')
.max(level=[0,1])
.reset_index())
print(df2)
name id 100 101 102 a b c
0 Tom 20 1 0 1 1 1 0
1 nick 21 0 1 0 0 1 1
2 Tom 22 1 0 0 1 0 0
编辑:解决方案DataFrame.pivot_table
,concat
和DataFrame.clip
:
df1 = df.pivot_table(index=['name','id'],
columns=['plan'],
aggfunc='size',
fill_value=0)
df2 = df.pivot_table(index=['name','id'],
columns=['drug'],
aggfunc='size',
fill_value=0)
df = pd.concat([df1, df2], axis=1).clip(upper=1).reset_index()
print(df)
name id 100 101 102 a b c
0 Tom 20 1 0 1 1 1 0
1 Tom 22 1 0 0 1 0 0
2 nick 21 0 1 0 0 1 1
推荐阅读
- laravel - Laravel 从循环添加到新集合
- mysql - SQL 更多行 ID 相同但列不同
- html - 如何使用 CSS 水平平均分布图像,使图像变大/缩小
- laravel - 无法使用 ParsedownServiceProvider 定位可发布资源错误
- html - 如何在html中创建一个有2行堆叠在它旁边的行?
- linux - Shell/Bash - 想要将文件数组映射到一组数字
- bash - gcp cli 错误 =(gcloud.logging.write) 无法识别的参数
- c# - 时间:2019-05-10 标签:c#wcf web-service client https connection never close
- blazor - Blazor wasm - 调试 - 无法查看任何变量的值
- html - 使用 Jinja 处理 Flask 中的按钮可见性