【问题标题】:Expand/create pandas columns from grouped rows by concatenating subid value and other column names通过连接 subid 值和其他列名从分组行展开/创建 pandas 列
【发布时间】:2019-12-08 13:55:03
【问题描述】:

我想通过基于列进行分组并将子索引(在另一列中)与其他两个列名连接来从 panda 数据帧创建新列。最好用一个例子来说明这一点。假设这是我的输入数据框:

                  filename     sub_id    x    y
0  2019-07-29T16-01-33.jpg          0  731  343
1  2019-07-29T16-01-33.jpg          1  741  283
2  2019-07-29T16-01-34.jpg          0  734  407
3  2019-07-29T16-01-34.jpg          1  757  348
4  2019-07-29T16-01-35.jpg          0  741  293
5  2019-07-29T16-01-35.jpg          1  760  380

我想得到这个:

                  filename    x0   y0   x1   y1
0  2019-07-29T16-01-33.jpg   731  343  741  283
1  2019-07-29T16-01-34.jpg   734  407  757  348
2  2019-07-29T16-01-35.jpg   741  293  760  380

sub_id 值(0 或 1)附加到 xy 列名称以创建新列并相应地传输相应的坐标值。

我假设我必须以某种方式使用 groupby 或加入,但不确定如何。

【问题讨论】:

    标签: pandas join pandas-groupby


    【解决方案1】:

    另一种方法:

    # create the columns for x0, x1, y0, y1
    df_unstacked= df.set_index(['filename', 'sub_id']).unstack(-1)
    # rename the column
    df_unstacked.columns= [''.join(map(str, c_tup)) for c_tup in df_unstacked.columns]
    

    结果是

                              x0   x1   y0   y1
    filename                                   
    2019-07-29T16-01-33.jpg  731  741  343  283
    2019-07-29T16-01-34.jpg  734  757  407  348
    2019-07-29T16-01-35.jpg  741  760  293  380
    

    【讨论】:

    • 这个比我的好。如果你想匹配 OP 输出 df.set_index(['filename', 'sub_id']).unstack(-1).sort_values('sub_id',axis=1) 也可以排序 :) +1
    • 你为什么要删除你的?
    • 我的看起来很笨拙,你的要好得多。 :)
    • 感谢您的回答 jottbe 和您的帮助 anky_91。
    • 嗯。通常pivot 解决方案通常更优雅,因为您不必手动设置索引。如果您能找到避免melt 的方法,我想它会更容易理解(我猜如果源数据框很大,融化可能会消耗额外的资源)。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多