有没有办法只在 pandas 中转置选定的列?
Is there any way to get transpose of selected columns only in pandas?
我有一个大型数据集,其中大约有 350 多列,我想将这 350 列转换为行并将行值转换为列。用户向品牌提供排名“1-10”,我想将排名 (1-10) 显示为列。
这是我的 df 的样子:
id Gender Age BMW Audi VW Mercedes
1 M 20 3 1 4 2
2 F 50 1 2 3 4
3 F 25 2 1 4 3
而且我想根据需要以这种方式更改它。
id Gender Age Rank1 Rank2 Rank3 Rank4
1 M 20 Audi Mercedes BMW VW
2 F 50 BMW Audi VW Mercedes
3 F 25 Audi BMW Mercedes VW
这样我就可以去掉这么多列了...有什么解决办法吗?
你可以melt+pivot
:
idx = ['id','Gender','Age']
m = df.melt(idx).pivot_table(index=idx,columns='value',values='variable',aggfunc='first')
out = m.add_prefix('Rank').reset_index(idx).rename_axis(index=None,columns=None)
print(out)
id Gender Age Rank1 Rank2 Rank3 Rank4
0 1 M 20 Audi Mercedes BMW VW
1 2 F 50 BMW Audi VW Mercedes
2 3 F 25 Audi BMW Mercedes VW
同样的想法,但是,您不能使用这种类型的转置来减少列
df.set_index(['id','Gender','Age']).stack().\
reset_index(level=-1).set_index(0,append=True)['level_3'].\
unstack(-1).add_prefix('rank_').reset_index()
0 id Gender Age rank_1 rank_2 rank_3 rank_4
0 1 M 20 Audi Mercedes BMW VW
1 2 F 50 BMW Audi VW Mercedes
2 3 F 25 Audi BMW Mercedes VW
我有一个大型数据集,其中大约有 350 多列,我想将这 350 列转换为行并将行值转换为列。用户向品牌提供排名“1-10”,我想将排名 (1-10) 显示为列。
这是我的 df 的样子:
id Gender Age BMW Audi VW Mercedes
1 M 20 3 1 4 2
2 F 50 1 2 3 4
3 F 25 2 1 4 3
而且我想根据需要以这种方式更改它。
id Gender Age Rank1 Rank2 Rank3 Rank4
1 M 20 Audi Mercedes BMW VW
2 F 50 BMW Audi VW Mercedes
3 F 25 Audi BMW Mercedes VW
这样我就可以去掉这么多列了...有什么解决办法吗?
你可以melt+pivot
:
idx = ['id','Gender','Age']
m = df.melt(idx).pivot_table(index=idx,columns='value',values='variable',aggfunc='first')
out = m.add_prefix('Rank').reset_index(idx).rename_axis(index=None,columns=None)
print(out)
id Gender Age Rank1 Rank2 Rank3 Rank4
0 1 M 20 Audi Mercedes BMW VW
1 2 F 50 BMW Audi VW Mercedes
2 3 F 25 Audi BMW Mercedes VW
同样的想法,但是,您不能使用这种类型的转置来减少列
df.set_index(['id','Gender','Age']).stack().\
reset_index(level=-1).set_index(0,append=True)['level_3'].\
unstack(-1).add_prefix('rank_').reset_index()
0 id Gender Age rank_1 rank_2 rank_3 rank_4
0 1 M 20 Audi Mercedes BMW VW
1 2 F 50 BMW Audi VW Mercedes
2 3 F 25 Audi BMW Mercedes VW