我有一个 df,其中包含与唯一值相关联的各种字符串。对于这些唯一值,我想删除不等于单独列表的行,除了最后一行。
使用下面的内容,Label
中的各种字符串值都与 Item
相关联。因此,对于每个唯一的 Item
,Label
中可能会有多行带有各种字符串。我只想保留 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
答案 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)
'Label'
isin
label_list
duplicated
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