python - 熊猫:重塑数据框
问题描述
我有一个熊猫的相关问题。我的数据框看起来像这样:
id val1 val2
0 1 0 1
1 1 1 0
2 1 0 0
3 2 1 1
4 2 1 1
5 2 1 0
6 3 0 0
7 3 0 1
8 3 1 1
9 4 1 0
10 4 0 1
11 4 0 0
我想把它变成类似的东西:
a b c
id a0 a1 b0 b1 c0 c1
1 0 1 1 0 0 0
2 1 1 1 1 1 0
3 0 0 1 1 1 1
4 1 0 0 1 0 0
我想到了添加一个由 a、b 和 c 循环枚举的 sub_id 列,然后对帧进行解栈。有没有更简单/更智能的解决方案?
非常感谢!
蒂姆
解决方案
如果可能的数字abc
被GroupBy.cumcount
用于计数器,创建MultiIndex
和DataFrame.set_index
重塑DataFrame.unstack
,最后排序第二级DataFrame.swaplevel
:
g = df.groupby('id').cumcount()
df = df.set_index(['id', g]).unstack().sort_index(axis=1, level=1).swaplevel(0,1,axis=1)
print (df)
0 1 2
val1 val2 val1 val2 val1 val2
id
1 0 1 1 0 0 0
2 1 1 1 1 1 0
3 0 0 0 1 1 1
4 1 0 0 1 0 0
如果想要a,b,c
的值是可能的从string.ascii_lowercase
和rename
列生成字典:
import string
d = dict(enumerate(string.ascii_lowercase))
df = df.rename(columns=d)
print (df)
a b c
val1 val2 val1 val2 val1 val2
id
1 0 1 1 0 0 0
2 1 1 1 1 1 0
3 0 0 0 1 1 1
4 1 0 0 1 0 0
重命名两个级别的解决方案是首先在以下范围内创建默认列名set_index
:
g = df.groupby('id').cumcount()
df = df.set_index(['id', g])
df.columns = range(len(df.columns))
df = df.unstack().sort_index(axis=1, level=1).swaplevel(0,1,axis=1)
print (df)
0 1 2
0 1 0 1 0 1
id
1 0 1 1 0 0 0
2 1 1 1 1 1 0
3 0 0 0 1 1 1
4 1 0 0 1 0 0
最后在列表理解中设置新值:
import string
d = dict(enumerate(string.ascii_lowercase))
df.columns = pd.MultiIndex.from_tuples([(d[a], f'{d[a]}{b}') for a, b in df.columns])
print (df)
a b c
a0 a1 b0 b1 c0 c1
id
1 0 1 1 0 0 0
2 1 1 1 1 1 0
3 0 0 0 1 1 1
4 1 0 0 1 0 0
推荐阅读
- javascript - 选择 jQuery 插件的麻烦
- java - Java8 Parallel Stream 需要时间来求和值
- javascript - 从`for Loop`合并两个分离的数组
- protocol-buffers - golang 中的 protoc 文档非常混乱
- javascript - 使用 jQuery 在延迟上关闭 Bootstrap 模态
- android - 在android中捕获屏幕大小的正确方法是什么
- java - Cucumber Maven:生成测试报告后执行一个逻辑
- java - SkyLine 的启动类和主要方法
- sass - 在另一个 scss 部分中导入 scss 部分
- javascript - 在 react.js 中填充必要的数据