我在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”位置的值,因此无法按预期运行。
谢谢!
答案 0 :(得分:2)
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
现在您要做的是重命名列/行。