Pandas数据帧:按子组中的顺序取消堆栈,而不是按值

时间:2016-03-21 13:24:22

标签: python pandas pivot dataframe stata

我正在尝试学习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

1 个答案:

答案 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