首页 > 解决方案 > 将数据从一对列拆分为多对列

问题描述

假设我在pythonand中有以下内容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 Namesis开始,D并以恰好在下一个NamesisD开始之前的行结束。

最有效的方法是什么?

标签: pythonpandas

解决方案


想法是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

推荐阅读