如果另一列中的值为空,则删除重复项-Pandas

时间:2019-12-30 14:55:17

标签: python pandas drop-duplicates

我所拥有的:

df

Name |Vehicle

Dave |Car
Mark |Bike
Steve|Car
Dave |
Steve|

我想从“名称”列中删除重复项,但前提是“车辆”列中的对应值为null。 我知道我可以使用

 df.dropduplicates(subset=['Name']) 

使用Keep =“ First”或“ Last”,但是我正在寻找一种从“名称”列中删除重复项的方法,其中“车辆”列的对应值为null。因此,基本上,如果“车辆”列不为空,则保留“名称”,然后删除其余部分。如果名称没有重复,则即使“车辆”中的对应值为空,也保留该行。

非常感谢

2 个答案:

答案 0 :(得分:3)

我认为您需要将链2掩码与按Series.notnaSeries.duplicated的按位AND&):

m1 = df['Vehicle'].notna()
m2 = ~df['Name'].duplicated()

df1 = df[m1 & m2]
print (df1)
    Name Vehicle
0   Dave     Car
1   Mark    Bike
2  Steve     Car

如果要分别执行这些操作,请先删除所有NaNs行,然后删除重复项,以避免测试NaN s行中的重复项(如有必要):

df2 = df.dropna(subset=['Vehicle']).drop_duplicates('Name')
print (df2)
    Name Vehicle
0   Dave     Car
1   Mark    Bike
2  Steve     Car

答案 1 :(得分:0)

这将同时过滤掉None和空值(如果存在任何非None或非空值),而仅保留Vehicle的第一个遇到的值< / p>

import pandas as pd

df=pd.DataFrame({"Name": ["Dave", "Mark", "Steve", "Dave", "Steve"], "Vehicle": ["Car", "Bike", "Car", None, ""]})

res=df.sort_values("Vehicle", ascending=False).groupby("Name")["Vehicle"].first().reset_index()

输出:

    Name Vehicle
0   Dave     Car
1   Mark    Bike
2  Steve     Car