Python 熊猫:在基于另一列创建的组中,对一列中的值重新排序

Python 熊猫:在基于另一列创建的组中,对一列中的值重新排序,python,pandas,Python,Pandas,我的数据已经根据一列按组排序。在每个组中,我试图对另一列中的值进行重新排序。下面的例子说明了我的意思: 目前我的数据是这样的,按运营商名称排序。第三栏显示了他们持有的产品类型。然而,我希望每个运营商都能将鸡肉排在第一位,这样看起来就像下面的第二张表 名称 数量 产品 承运人A 1. 苹果 承运人A 9 橘子 承运人A 8. 香蕉 承运人A 10 鸡 承运人A 28 全部的 承运人B 9 苹果 承运人B 4. 橘子 承运人B 6. 香蕉 承运人B 9 鸡 承运人B 28 全部的 载体C 5. 苹果

我的数据已经根据一列按组排序。在每个组中,我试图对另一列中的值进行重新排序。下面的例子说明了我的意思:

目前我的数据是这样的,按运营商名称排序。第三栏显示了他们持有的产品类型。然而,我希望每个运营商都能将鸡肉排在第一位,这样看起来就像下面的第二张表

名称 数量 产品 承运人A 1. 苹果 承运人A 9 橘子 承运人A 8. 香蕉 承运人A 10 鸡 承运人A 28 全部的 承运人B 9 苹果 承运人B 4. 橘子 承运人B 6. 香蕉 承运人B 9 鸡 承运人B 28 全部的 载体C 5. 苹果 载体C 8. 橘子 载体C 9 香蕉 载体C 10 鸡 载体C 32 全部的
使用
pd.CategoricalDType
完成以下操作:

# create your ordered list
cat = ['Chicken'] + sorted([p for p in df["Product"].unique()
                                  if not p in ['Chicken', 'Total']]) + ['Total']

# set as category
df = df.astype({'Product': pd.CategoricalDtype(cat, ordered=True)})

使用
pd.CategoricalDType
完成以下操作:

# create your ordered list
cat = ['Chicken'] + sorted([p for p in df["Product"].unique()
                                  if not p in ['Chicken', 'Total']]) + ['Total']

# set as category
df = df.astype({'Product': pd.CategoricalDtype(cat, ordered=True)})

这就是我将如何一步一步地做到这一点

#获取唯一类别并转换为列表
产品=列表(df.Product.unique())
#将“鸡”移到列表的前面
产品.插入(0,产品.pop(产品.索引(“鸡肉”))
#按照产品列表的顺序将“产品”列转换为分类
df.Product=pd.category(df.Product,products)
#基于两列进行排序
df=df.sort_值([“名称”、“产品”])

这是我一步一步来做的方式

#获取唯一类别并转换为列表
产品=列表(df.Product.unique())
#将“鸡”移到列表的前面
产品.插入(0,产品.pop(产品.索引(“鸡肉”))
#按照产品列表的顺序将“产品”列转换为分类
df.Product=pd.category(df.Product,products)
#基于两列进行排序
df=df.sort_值([“名称”、“产品”])

感谢您的解决方案。与其他解决方案一样,不幸的是,我没有指出必须保留载波的显示顺序。在我的示例中,它们已经按字母顺序排列,但在我的实际数据集中,情况并非如此,我也不打算这样做。我已经用这个额外的问题更新了我的问题。谢谢你的解决方案。与其他解决方案一样,不幸的是,我没有指出必须保留载波的显示顺序。在我的示例中,它们已经按字母顺序排列,但在我的实际数据集中,情况并非如此,我也不打算这样做。我已经用这个额外的问题更新了我的问题。对不起,我忘了添加“名称”中的顺序应该保留。您的代码在本例中有效,因为名称已按字母顺序排序。但在实际的数据集中,它不是按这种方式排序的,而是必须保留原来的顺序。我已经更新了我的问题,谢谢,请忽略上面的评论-如果我在您建议的代码之后定义另一个排序机制来再次对“Name”进行排序,那么这个解决方案将非常有效。对不起,我忘了添加应该保留“Name”中的顺序。您的代码在本例中有效,因为名称已按字母顺序排序。但在实际的数据集中,它不是按这种方式排序的,而是必须保留原来的顺序。我已经更新了我的问题,谢谢,请忽略上面的评论-如果我在您建议的代码之后定义另一个排序机制来再次对“Name”进行排序,这个解决方案将非常有效。
>>> df.sort_values(['Name', 'Product'])
         Name  Amount  Product
3   Carrier A      10  Chicken
0   Carrier A       1   Apples
2   Carrier A       8  Bananas
1   Carrier A       9  Oranges
4   Carrier A      28    Total
8   Carrier B       9  Chicken
5   Carrier B       9   Apples
7   Carrier B       6  Bananas
6   Carrier B       4  Oranges
9   Carrier B      28    Total
13  Carrier C      10  Chicken
10  Carrier C       5   Apples
12  Carrier C       9  Bananas
11  Carrier C       8  Oranges
14  Carrier C      32    Total