如何根据值对Pandas DataFrame中的行进行分组以创建新列?

0 投票
1 回答
29 浏览
提问于 2025-04-12 00:25

我有一个数据表 df,长得像这样:

`    image_id  category_id chessboard_position
0         0            7                  a8
1         0            8                  b8
2         0            9                  c8
3         1            6                  f7
4         1            6                  g7
5         1            6                  h7
6         1            0                  b4
7         1            0                  a2`

我想把它变成这样:

`    image_id      0           6           7   8   9           
0         0                                a8  b8  c8
1         1    {b4, a2}   {f7, g7, h7}                  

我试着用这个方法:df = df.groupby('image_id')["chessboard_position"].apply(lambda x: pd.Series(x.values)).unstack(1)

这样做后,我得到了类似于:

`    image_id          1   2   3    4      5  
0         0            a8  b8  c8                             
1         1            f7  g7  h7   b4    a2          
           `

这个方法会按照棋盘位置的顺序填充新列。不过,我需要一种方法,可以根据类别 ID 的值来排序“展开”的结果。

1 个回答

0

你可以使用 pd.crosstab 这个函数:

out = (
    pd.crosstab(
        df["image_id"],
        df["category_id"],
        df["chessboard_position"],
        aggfunc=lambda v: v if len(v) == 1 else set(v),
    )
    .reset_index()
    .rename_axis(columns=None)
)

print(out)

输出结果是:

   image_id         0             6    7    8    9
0         0       NaN           NaN   a8   b8   c8
1         1  {a2, b4}  {g7, h7, f7}  NaN  NaN  NaN

撰写回答