Python 对熊猫中的特定列进行排序
我有一个数据帧(示例如下所示) 我想做的是根据大小对值进行排序,这样最终的数据帧应该如下所示:Python 对熊猫中的特定列进行排序,python,pandas,Python,Pandas,我有一个数据帧(示例如下所示) 我想做的是根据大小对值进行排序,这样最终的数据帧应该如下所示: Type SKU Description FullDescription Size Price Variable 2 Boots Shoes on sale S,M,XL Variation 2.7 Boots S
Type SKU Description FullDescription Size Price
Variable 2 Boots Shoes on sale S,M,XL
Variation 2.7 Boots S S 330
Variation 2.6 Boots M M 330
Variation 2.5 Boots XL XL 330
Variable 3 Boots Helmet Sizes E41,E42
Variation 3.2 Helmet E41 E41 89
Variation 3.8 Helmet E42 E42 89
我可以只使用对值进行排序()
,但似乎找不到任何东西来保持类型和SKU的顺序。任何帮助都将不胜感激。稍长一点
out = df.groupby(df.Type.eq('Variable').cumsum()).\
apply(lambda x : pd.concat([x.iloc[[0]].assign(Size=lambda y : y['Size'].str.split(',').str[::-1].str.join(',')),
x.iloc[1:,].iloc[::-1]]))
Out[458]:
Type SKU Description Size Price
Type
1 0 Variable 2.0 Boots S,M,XL NaN
3 Variation 2.7 BootsS S 330.0
2 Variation 2.6 BootsM M 330.0
1 Variation 2.5 BootsXL XL 330.0
2 4 Variable 3.0 Boots E41,E42 NaN
6 Variation 3.2 HelmetE41 E41 89.0
5 Variation 3.8 HelmetE42 E42 89.0
按大小的逻辑排序是什么。在您的第二行到第四行中,
XL
后跟M
和S
如何?最后两行的排序方式是E41
和E42
?是否尝试更改单个记录?或者试图改变数据帧中记录的排序方式?从您的示例来看,您似乎试图更改描述与大小的配对,因此“Boots S”的大小为“XL”。您的意思是将E41、E42切换为“靴子头盔尺寸”行中的E42、E41吗?大小列是否需要自定义排序函数,或者通常的字母排序是否足够?请修复所有打字错误,包括实际的sort_values()调用、sort_values()的输出,并详细说明该输出的错误。非常抱歉,我不确定它是如何发布以前未编辑的版本的,我已使用所需的正确数据框再次编辑了该问题,这将有助于清楚地理解该问题。真的很抱歉again@Manakin请随意回答,它现在打开了Ice one,我为他的原始df做了我的答案,但新的df有很多行代码,所以我认为你的更好,不知道为什么它不能在我的原始数据集上工作,它在变量下面显示变量,顺序仍然不正确,但工作正常,只是顺序相反。变量2低于变量2.7,2.6,2.5,变量的大小为XL,M,S。对于类型,它应该显示索引,但在我的原始数据集中,它在整个列中显示0
out = df.groupby(df.Type.eq('Variable').cumsum()).\
apply(lambda x : pd.concat([x.iloc[[0]].assign(Size=lambda y : y['Size'].str.split(',').str[::-1].str.join(',')),
x.iloc[1:,].iloc[::-1]]))
Out[458]:
Type SKU Description Size Price
Type
1 0 Variable 2.0 Boots S,M,XL NaN
3 Variation 2.7 BootsS S 330.0
2 Variation 2.6 BootsM M 330.0
1 Variation 2.5 BootsXL XL 330.0
2 4 Variable 3.0 Boots E41,E42 NaN
6 Variation 3.2 HelmetE41 E41 89.0
5 Variation 3.8 HelmetE42 E42 89.0