自定义排序并在熊猫中占据第一行

我有一个 csv 如下


+-----+---------+-----------+------------+

| ID  | version | Name      | State      |

+-----+---------+-----------+------------+

| 101 | 1       | Nut       | In-Transit |

| 101 | 1       | Nut       | Cancelled  |

| 101 | 1       | Nut       | Delivered  |

| 101 | 2       | Nut 2.0   | In-Transit |

| 102 | 1       | Screw     | Shipped    |

| 102 | 1       | Screw     | In-Transit |

| 102 | 2       | Screw 2.0 | Shipped    |

| 102 | 2       | Screw 2.0 | Cancelled  |

+-----+---------+-----------+------------+

现在我想在每个 ID 和版本组合的所有可用状态中采用最高状态(基于以下优先级)。

我的定制订单

  1. 发表

  2. 在途中

  3. 发货

  4. 取消

预期产出

+-----+---------+-----------+------------+

| ID  | version | Name      | State      |

+-----+---------+-----------+------------+

| 101 | 1       | Nut       | Delivered  |

| 101 | 2       | Nut 2.0   | In-Transit |

| 102 | 1       | Screw     | In-Transit |

| 102 | 2       | Screw 2.0 | Shipped    |

+-----+---------+-----------+------------+

我试过下面的查询但没有工作。我是 python 的新手,我不确定如何解决这个问题。


import pandas as pd


mydata = pd.read_csv('C:/Mypython/Newyork',encoding = "ISO-8859-1")


mydata['state'] = pd.Categorical(mydata['state'], ["Delivered","In-Transit","Shipped","Cancelled"])


mydate.sort_values('state').drop_duplicates(['ID','VERSION'],keep='first')


叮当猫咪
浏览 79回答 2
2回答

蝴蝶刀刀

对我来说工作正常,似乎没有分配回新变量:mydata['State'] = pd.Categorical(mydata['State'],                                 ["Delivered", "In-Transit", "Shipped", "Cancelled"],                                  ordered=True)#keep='first'is default value, so should be omittedmydata = mydata.sort_values('state').drop_duplicates(['ID','version'])print (mydata)    ID  version       Name       state2  101        1        Nut   Delivered3  101        2    Nut 2.0  In-Transit5  102        1      Screw  In-Transit6  102        2  Screw 2.0     Shipped此外,如果想要按 排序输出ID,version请按多列添加排序:mydata['State'] = pd.Categorical(mydata['State'],                                 ["Delivered", "In-Transit", "Shipped", "Cancelled"],                                  ordered=True)mydata = mydata.sort_values(['ID','version','state']).drop_duplicates(['ID','version'])

12345678_0001

使用pd.Categoricalwithordered=True创建一个分类变量,然后sort_values在这个分类变量上使用groupbyonID, version和aggusing first:mydata['State'] = pd.Categorical(mydata['State'], ["Delivered", "In-Transit", "Shipped", "Cancelled"], ordered=True)df = mydata.sort_values('State').groupby(['ID', 'version'], as_index=False).first()结果:    ID  version       Name       State0  101        1        Nut   Delivered1  101        2    Nut 2.0  In-Transit2  102        1      Screw  In-Transit3  102        2  Screw 2.0     Shipped
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python