Pandas dataframe:按子组中的顺序取消堆叠,而不是按值

2024-03-29 08:08:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力学习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的顺序。完成后,我希望得到一个如下所示的数据帧:

^{pr2}$

Tags: 数据idpandas排序顺序格式表格x1
1条回答
网友
1楼 · 发布于 2024-03-29 08:08:10

你可以做点什么

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

一步一步,首先我们可以删除重复项并排序:

^{pr2}$

然后我们可以对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

相关问题 更多 >