python - 缺少值时如何旋转和重命名连接的级别列?
问题描述
我有一个数据框。每个 id 有几个代码,每个代码都有统计信息。并非所有 id 都拥有其他人拥有的所有代码。我需要旋转数据框,以便每个 id 都有一行,每个代码-统计对都有一列。
我应该如何使用 pandas 0.24.2 和 python 3.6 最有效地做到这一点?
谢谢
import pandas as pd
df = pd.DataFrame({'id':[11, 11, 11, 12, 12, 13], 'code':['a', 'b', 'c', 'a', 'b', 'a'], 'max':[111, 112, 113, 221, 222, 333], 'min':[10, 11, 12, 21, 22, 33]})
df
Results in
id code max min
0 11 a 111 11
1 11 b 112 12
2 11 c 113 13
3 12 a 221 21
4 12 b 222 22
5 13 c 333 33
我需要将其转换为
id a_max a_min b_max b_min c_max c_min
11 111 11 112 12 113 13
12 221 21 222 22 None None
13 None None None None 333 33
更新 我发布的代码有错误。对于代码“a”,代码应为 11、12、13 而不是 10、11、12。
import pandas as pd
df = pd.DataFrame({'id':[11, 11, 11, 12, 12, 13], 'code':['a', 'b', 'c', 'a', 'b', 'a'], 'max':[111, 112, 113, 221, 222, 333], 'min':[11, 12, 13, 21, 22, 33]})
df
解决方案
DataFrame.set_index
与DataFrame.unstack
and一起使用,然后将索引DataFrame.sort_index
展平并转换为按列:MultiIndex
reset_index
df1 = df.set_index(['id','code']).unstack().sort_index(axis=1, level=1)
df1.columns = df1.columns.map('_'.join)
df1 = df1.reset_index()
print (df1)
id max_a min_a max_b min_b max_c min_c
0 11 111.0 10.0 112.0 11.0 113.0 12.0
1 12 221.0 21.0 222.0 22.0 NaN NaN
2 13 333.0 33.0 NaN NaN NaN NaN
如果可能成对重复是必要的聚合DataFrame.pivot_table
:
df = pd.DataFrame({'id':[11, 11, 11, 12, 12, 13],
'code':['a', 'a', 'c', 'a', 'b', 'a'],
'max':[111, 112, 113, 221, 222, 333],
'min':[10, 11, 12, 21, 22, 33]})
print (df)
id code max min
0 11 a 111 10 <--- 11, a
1 11 a 112 11 <--- 11, a
2 11 c 113 12
3 12 a 221 21
4 12 b 222 22
5 13 a 333 33
df1 = df.pivot_table(index='id',columns='code', aggfunc='mean').sort_index(axis=1, level=1)
#alternative
#df1 = df.groupby(['id','code']).mean().unstack().sort_index(axis=1, level=1)
df1.columns = df1.columns.map('_'.join)
df1 = df1.reset_index()
print (df1)
id max_a min_a max_b min_b max_c min_c
0 11 111.5 10.5 NaN NaN 113.0 12.0
1 12 221.0 21.0 222.0 22.0 NaN NaN
2 13 333.0 33.0 NaN NaN NaN NaN
推荐阅读
- colors - 为什么摩托罗拉和三星的手机颜色不一样?
- firebase - 在没有用户的情况下使用 firebase 实时数据库进行身份验证
- android - Flutter:当函数作为前台服务执行时,会导致 MissingPluginException
- linux - 使用 Ansible 创建主机名到 IP 的字典
- javascript - p5js,如何使颜色跟随数组?
- python - numpy减法的操作数广播
- python - 使用 docker 安装 ruamel.yaml.clib
- node.js - ts + webpack 捆绑节点找不到模块“路径”
- amazon-web-services - AWS 托管的 Active Directory 用户身份验证问题
- python - 来自 Vivino.com 的数据抓取 - 葡萄酒信息和评论