我正在尝试学习Python / Pandas并得到我认为是一个非常基本的问题。
我有以下表格的数据:
id X 1 1 1 2 2 2 2 3 3 4 3 5 3 5 3 3 3 3 3 4 4 3 4 4 4 6
我希望通过类似于unstack
格式的内容转换数据:我想按id
进行分组,对X
值进行排序,将第一个X
放入 - x1
中的值,X
中的第二个x2
- 值等。数据集相当大(超过1百万行“)。 X
中的大部分值都是唯一的(因此我不想使用X的值作为列名,而是使用X的顺序) 。在我完成之后,我想要得到一个如下所示的数据框:
id x1 x2 x3 1 1 2 nan 2 2 3 nan 3 3 4 5 4 3 4 6
答案 0 :(得分:0)
IIUC,你可以做点什么
>>> df = df.drop_duplicates()
>>> df = df.sort_values(["id", "X"])
>>> df["xcol"] = "x" + (df.groupby("id")["X"].rank().astype(int)).astype(str)
>>> df = df.pivot(index="id", columns="xcol", values="X")
>>> df
xcol x1 x2 x3
id
1 1 2 NaN
2 2 3 NaN
3 3 4 5
4 3 4 6
一步一步,首先我们可以删除重复项并排序:
>>> df = df.drop_duplicates()
>>> df = df.sort_values(["id", "X"])
>>> df
X id
0 1 1
1 2 1
2 2 2
3 3 2
7 3 3
4 4 3
5 5 3
10 3 4
11 4 4
12 6 4
然后我们可以对groupby中的元素进行排名,并构建我们将在列中使用的适当值(cumcount
也可以在这里工作):
>>> df["xcol"] = "x" + (df.groupby("id")["X"].rank().astype(int)).astype(str)
>>> df
X id xcol
0 1 1 x1
1 2 1 x2
2 2 2 x1
3 3 2 x2
7 3 3 x1
4 4 3 x2
5 5 3 x3
10 3 4 x1
11 4 4 x2
12 6 4 x3
最后我们转向:
>>> df = df.pivot(index="id", columns="xcol", values="X")
>>> df
xcol x1 x2 x3
id
1 1 2 NaN
2 2 3 NaN
3 3 4 5
4 3 4 6
如果您坚持,我们可以准确地获得您描述的输出格式:
>>> df.columns.name = None
>>> df.reset_index()
id x1 x2 x3
0 1 1 2 NaN
1 2 2 3 NaN
2 3 3 4 5
3 4 3 4 6