删除不等于唯一项目值的行 - 熊猫

时间:2021-03-19 01:19:22

标签: pandas

我有一个 df,其中包含与唯一值相关联的各种字符串。对于这些唯一值,我想删除不等于单独列表的行,除了最后一行。

使用下面的内容,Label 中的各种字符串值都与 Item 相关联。因此,对于每个唯一的 ItemLabel 中可能会有多行带有各种字符串。我只想保留 label_list 中的字符串,除了最后一行。

我不确定我是否可以用另一种方式来执行此操作,因为不在 label_list 中的字符串数量太多而无法解释。订购车也各不相同。因此,对于 Item 中的每个唯一值,我真的只想要最后一行以及 label_list 中的任何行。

label_list = ['A','B','C','D']

df = pd.DataFrame({  
    'Item' : [10,10,10,10,10,20,20,20],  
    'Label' : ['A','X','C','D','Y','A','B','X'],    
    'Count' : [80.0,80.0,200.0,210.0,260.0,260.0,300.0,310.0],                                      
    })

df = df[df['Label'].isin(label_list)]

预期输出:

   Item Label  Value
0    10     A   80.0
1    10     C  200.0
2    10     D  210.0
3    10     Y  260.0
4    20     A  260.0
5    20     B  300.0
6    20     X  310.0

2 个答案:

答案 0 :(得分:1)

想到这是一个快速而肮脏的解决方案:

.bash_profile

我们将附加每个 df = pd.concat([df[df['Label'].isin(label_list)],df.drop_duplicates('Item',keep='last')]).drop_duplicates(keep='first') 组的最后一行,但如果最后一行被复制,因为它也在 Item 中,我们也对连接的输出使用删除重复项。

答案 1 :(得分:1)

  1. 检查是否 'Label' isin label_list
  2. 检查行是否为 duplicated
  3. 布尔切片数据帧

isin_ = df['Label'].isin(label_list)
duped = df.duplicated('Item', keep='last')

df[isin_ | ~duped]

   Item Label  Count
0    10     A   80.0
2    10     C  200.0
3    10     D  210.0
4    10     Y  260.0
5    20     A  260.0
6    20     B  300.0
7    20     X  310.0