python - 将数据从一对列拆分为多对列
问题描述
假设我在python
and中有以下内容pandas
:
Names Values
0 A 6
1 B 8
2 C 3
3 D 5
4 E 1
5 F 3
6 D 9
7 E 6
8 F 4
9 G 3
10 D 1
11 E 5
12 F 6
我想将其转换为以下内容:
Name_1 Values_1 Name_2 Values_2 Name_3 Values_3
0 D 5 D 9 D 1
1 E 1 E 6 E 5
2 F 3 F 4 F 6
3 NA NA G 3 NA NA
基本上,我想要做的是将原始的列对拆分为数据块,这些数据块以行 where Names
is开始,D
并以恰好在下一个Names
isD
开始之前的行结束。
最有效的方法是什么?
解决方案
想法是MultiIndex
通过Series.cumsum
与比较系列与创建GroupBy.cumcount
,然后通过重塑DataFrame.unstack
:
b = df['Names'].eq('D').cumsum()
a = df.groupby(b).cumcount()
df1 = df.set_index([a, b]).unstack().drop(0, axis=1, level=1).sort_index(axis=1, level=1)
df1.columns = [f'{x}_{y}' for x, y in df1.columns]
print (df1)
Names_1 Values_1 Names_2 Values_2 Names_3 Values_3
0 D 5.0 D 9.0 D 1.0
1 E 1.0 E 6.0 E 5.0
2 F 3.0 F 4.0 F 6.0
3 NaN NaN G 3.0 NaN NaN
推荐阅读
- javascript - 将数组转换为制表符分隔的 Mailchimp 文件
- ant - 构建失败的 SAP Hybris
- python - Django Forms保存数据的问题
- javascript - Ajax 将布尔值与 HTML 一起从服务器传递到具有 HTML 数据类型的客户端
- java - Java - 循环平均 rgb 值应该是破坏性的......但不是
- java - 多次引用方法时保留变量
- c - 宏for_each_process的内核模块编译错误
- angular - 我如何获得 FormBuilder angular 的值并将其与属性 NgStyle 一起使用
- javascript - 反应输入状态不使用设置状态的更新函数更新
- spring - 使用 Java 8 的 Spring 的 @Condtional 注释