Pandas分组,并进行分类排序,以删除重复项

nwlls2ji  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(99)

我有一个 Dataframe 如下

df = pd.DataFrame({
        "Name": ["Tim", "Tim", "Tim", "Tim", "Tim",'Jack','Jack','Jack'],
        "Status": ["A1", "E1", "B3", "D4", "C90","A1","C90","B3"]
})

我的状态变量的实际顺序是B3〈A1〈D4〈C90〈E1。
因此,最后一个值为E1,第一个值为B3。
我想做以下几点
a)按Name分组
a)根据上述分类排序对值进行排序
c)仅保留最后一个值(基于Name列删除重复值后)
所以,我尝试了以下方法

df["Status"] = df["Status"].astype("category")
df["Status"] = df["Status"].cat.set_categories(["B3", "A1", "D4", "C90", "E90"], ordered=True)
df = df.sort_values(['Status'])
df_cleaned = df.drop_duplicates(['Status'],keep='last')

但这会导致不正确的输出。
我希望输出如下所示(每个Name及其最新/最后一个Status值占一行)

Name   Status
Tim     E1
Jack    C90
omhiaaxx

omhiaaxx1#

将现有类别添加到列表,并使用“按Name列删除重复项”进行排序:

df["Status"] = pd.Categorical(df["Status"], 
                              categories=["B3", "A1", "D4", "C90", "E90","E1"], 
                              ordered=True)

df_cleaned = (df.sort_values(['Status'])
                .drop_duplicates(['Name'],keep='last')

print (df_cleaned)
   Name Status
6  Jack    C90
1   Tim     E1

如果可能,某些值不在类别列表中,也删除缺失值:

df_cleaned = (df.dropna(subset=['Status'])
                .sort_values(['Status'])
                .drop_duplicates(['Name'],keep='last')
qgzx9mmu

qgzx9mmu2#

您可以使用encode_categorical从pyjanitor抽象类别列的创建,并使用drop_duplicatesgroupby

# pip install pyjanitor
import pandas as pd
import janitor
(df
.encode_categorical(Status=['B3', 'A1', 'D4','C90','E1'])
.sort_values(['Name','Status'])
# you can skip the lines below with drop_duplicates
# .drop_duplicates(subset='Name', keep='last')
.groupby('Name', as_index=False)
.Status
.last()
) 
   Name Status
0  Jack    C90
1   Tim     E1

相关问题