重塑具有各种长度行的数据框

时间:2018-10-30 17:20:24

标签: python python-3.x pandas pandas-groupby

我在python中有一个数据框,如下所示:

ID    Value
001   0.5
001   0.2
001   0.5
001   0.0
002   0.4
002   0.6
002   0.6

我希望将数据重塑为如下形式:

ID    Val1    Val2   Val3   Val4
001   0.5     0.2    0.5    0.0
002   0.4     0.6    0.6    NaN

有人可以帮忙吗?我的第一个想法是使用“数据透视表”对数据进行解链,但由于没有表示“ Val”位置的值,因此无法按预期运行。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以先assign个索引器系列,然后再pivot

res = df.assign(ValNum=df.groupby('ID').cumcount()+1)\
        .pivot(index='ID', columns='ValNum', values='Value')\
        .reset_index()

print(res)

ValNum  ID    1    2    3    4
0        1  0.5  0.2  0.5  0.0
1        2  0.4  0.6  0.6  NaN

答案 1 :(得分:2)

ID进行分组,然后重置索引以使列保持一致且不堆叠

df.groupby('ID')['Value'].apply(lambda df: df.reset_index(drop=True)).unstack()
      0    1    2    3
ID
1   0.5  0.2  0.5  0.0
2   0.4  0.6  0.6  NaN

或不使用ID作为索引:

df.sort_values('ID').groupby('ID')['Value'].apply(lambda df: df.reset_index(drop=True)).unstack().reset_index()
  ID    0    1    2    3
0  1  0.5  0.2  0.5  0.0
1  2  0.4  0.6  0.6  NaN

答案 2 :(得分:2)

这可能有效:

>>> df = pd.DataFrame({"id": ["001"]*4 + ["002"]*3, "value": [0.5, 0.2, 0.5, 0.0, 0.4, 0.6, 0.6]})
>>> df
    id  value
0  001    0.5
1  001    0.2
2  001    0.5
3  001    0.0
4  002    0.4
5  002    0.6
6  002    0.6
>>> pd.concat([pd.Series(list(g["value"]), name=x) for x, g in df.groupby("id")], axis=1).T
       0    1    2    3
001  0.5  0.2  0.5  0.0
002  0.4  0.6  0.6  NaN

现在您要做的是重命名列/行。