Pandas 通过连接subid值和其他列名,从分组行展开/创建列

Pandas 通过连接subid值和其他列名,从分组行展开/创建列,pandas,join,pandas-groupby,Pandas,Join,Pandas Groupby,我希望通过基于列进行分组并将子索引(在另一列中)与其他两个列名连接,从panda dataframe创建新的列。这最好用一个例子来说明。假设这是我的输入数据帧: 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.jp

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

                  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)附加到
x
y
列名中,以创建新列和相应传输的相应坐标值

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

还有另一种方法:

# 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
还有一种方法:

# 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)。排序_值('sub_id',axis=1)
:)+1为什么要删除您的?我的看起来很笨拙,您的要好得多。:)谢谢你的回答和帮助。一般来说,
pivot
解决方案通常更优雅,因为您不必手动设置索引。如果您可以找到一种方法来避免
melt
我想这会更容易理解(如果源数据帧很大,那么melt可能会消耗额外的资源)。这比我的要好。如果您想匹配OP输出
df,您也可以进行排序。set_index(['filename',sub_id'])。unstack(-1)。排序_值('sub_id',axis=1)
:)+1为什么要删除您的?我的看起来很笨拙,您的要好得多。:)谢谢你的回答和帮助。一般来说,
pivot
解决方案通常更优雅,因为您不必手动设置索引。如果您能够找到一种避免
melt
的方法,我想这会更容易理解(如果源数据帧很大,那么melt可能会消耗额外的资源)。