Pandas将索引复制到数据帧

时间:2016-06-22 09:31:24

标签: python pandas dataframe pivot

我有一个带有重复索引的系列,我想将其转换为多列DataFrame。

In [60]: np.random.seed(123456)

In [61]: b=pd.Series(np.random.random(30), index=range(6)*5)
In [62]: b
Out[62]: 
0    0.126970
1    0.966718
2    0.260476
3    0.897237
4    0.376750
5    0.336222
0    0.451376
1    0.840255
2    0.123102
3    0.543026
4    0.373012
5    0.447997
0    0.129441
1    0.859879
2    0.820388
3    0.352054
4    0.228887
5    0.776784
0    0.594784
1    0.137554
2    0.852900
3    0.235507
4    0.146227
5    0.589869
0    0.574012
1    0.061270
2    0.590426
3    0.245350
4    0.340445
5    0.984729
dtype: float64

我需要将其转换为具有多个列的DataFrame,如下所示:

In [70]:  np.random.seed(123456)

In [71]: pd.DataFrame(np.random.random((5,6))).transpose()
Out[71]: 
          0         1         2         3         4
0  0.126970  0.451376  0.129441  0.594784  0.574012
1  0.966718  0.840255  0.859879  0.137554  0.061270
2  0.260476  0.123102  0.820388  0.852900  0.590426
3  0.897237  0.543026  0.352054  0.235507  0.245350
4  0.376750  0.373012  0.228887  0.146227  0.340445
5  0.336222  0.447997  0.776784  0.589869  0.984729

我检查了pivotgroupBy,但无法弄清楚如何让它们为此工作。

1 个答案:

答案 0 :(得分:2)

如果索引中的值0可以是群组的边缘,则可以先从DataFrame创建Serie,然后cumsum再创建groups,最后{{ 3}}:

df = pd.DataFrame({'a':b})
df['g'] = (df.index == 0).cumsum()
print (df)
          a  g
0  0.126970  1
1  0.966718  1
2  0.260476  1
3  0.897237  1
4  0.376750  1
5  0.336222  1
0  0.451376  2
1  0.840255  2
2  0.123102  2
3  0.543026  2
4  0.373012  2
5  0.447997  2
0  0.129441  3
1  0.859879  3
2  0.820388  3
3  0.352054  3
4  0.228887  3
5  0.776784  3
0  0.594784  4
1  0.137554  4
2  0.852900  4
3  0.235507  4
4  0.146227  4
5  0.589869  4
0  0.574012  5
1  0.061270  5
2  0.590426  5
3  0.245350  5
4  0.340445  5
5  0.984729  5
print (pd.pivot(index=df.index, columns=df.g, values=df.a))
g         1         2         3         4         5
0  0.126970  0.451376  0.129441  0.594784  0.574012
1  0.966718  0.840255  0.859879  0.137554  0.061270
2  0.260476  0.123102  0.820388  0.852900  0.590426
3  0.897237  0.543026  0.352054  0.235507  0.245350
4  0.376750  0.373012  0.228887  0.146227  0.340445
5  0.336222  0.447997  0.776784  0.589869  0.984729

使用pivot的另一个更通用的解决方案:

df = pd.DataFrame({'a':b})

df['g'] = df.groupby(level=0)['a'].cumcount() + 1

print (pd.pivot(index=df.index, columns=df.g, values=df.a))

g         1         2         3         4         5
0  0.126970  0.451376  0.129441  0.594784  0.574012
1  0.966718  0.840255  0.859879  0.137554  0.061270
2  0.260476  0.123102  0.820388  0.852900  0.590426
3  0.897237  0.543026  0.352054  0.235507  0.245350
4  0.376750  0.373012  0.228887  0.146227  0.340445
5  0.336222  0.447997  0.776784  0.589869  0.984729