我所拥有的:
df
Name |Vehicle
Dave |Car
Mark |Bike
Steve|Car
Dave |
Steve|
我想从“名称”列中删除重复项,但前提是“车辆”列中的对应值为null。 我知道我可以使用
df.dropduplicates(subset=['Name'])
使用Keep =“ First”或“ Last”,但是我正在寻找一种从“名称”列中删除重复项的方法,其中“车辆”列的对应值为null。因此,基本上,如果“车辆”列不为空,则保留“名称”,然后删除其余部分。如果名称没有重复,则即使“车辆”中的对应值为空,也保留该行。
非常感谢
答案 0 :(得分:3)
我认为您需要将链2掩码与按Series.notna
和Series.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