为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

叮当猫咪 2023-04-25 17:09:10
我有一个 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 和版本组合的所有可用状态中采用最高状态(基于以下优先级)。我的定制订单发表在途中发货取消预期产出+-----+---------+-----------+------------+| 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 pdmydata = 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')
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

对我来说工作正常,似乎没有分配回新变量:


mydata['State'] = pd.Categorical(mydata['State'], 

                                ["Delivered", "In-Transit", "Shipped", "Cancelled"], 

                                 ordered=True)


#keep='first'is default value, so should be omitted

mydata = mydata.sort_values('state').drop_duplicates(['ID','version'])

print (mydata)

    ID  version       Name       state

2  101        1        Nut   Delivered

3  101        2    Nut 2.0  In-Transit

5  102        1      Screw  In-Transit

6  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'])



查看完整回答
反对 回复 2023-04-25
?
12345678_0001

TA贡献1802条经验 获得超5个赞

使用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       State

0  101        1        Nut   Delivered

1  101        2    Nut 2.0  In-Transit

2  102        1      Screw  In-Transit

3  102        2  Screw 2.0     Shipped


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 75 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信