Python 基于相关id子集数据帧的多个条件

Python 基于相关id子集数据帧的多个条件,python,pandas,Python,Pandas,我有一个名为df的数据框,它有一个id列和一个related\u id列。如果相关的_id不为null,则表示存在桌面版本和移动版本。 我想将此数据集子集,以便在存在相关id的情况下仅保留桌面实例。但是,也存在这样的情况,即可能存在具有相关id的移动观测,该id也是移动观测(ID7和ID8是示例)。在这种情况下,我只想保留其中一个观察结果 输入: id related_id type 1e 2e desktop 2e 1e mobile 3x NaN

我有一个名为
df
的数据框,它有一个
id
列和一个
related\u id
列。如果相关的_id不为null,则表示存在桌面版本和移动版本。 我想将此数据集子集,以便在存在相关id的情况下仅保留桌面实例。但是,也存在这样的情况,即可能存在具有相关id的移动观测,该id也是移动观测(ID7和ID8是示例)。在这种情况下,我只想保留其中一个观察结果

输入:

id related_id type
1e  2e          desktop
2e  1e          mobile
3x  NaN        desktop
4w  6w          desktop
5m  NaN        mobile
6w  4w          mobile
7q  8q          mobile
8q  7q          mobile

输出:

id related_id type
1e  2e          desktop
3x  NaN        desktop
4w  6w          desktop
5m  NaN        mobile
7q  8q          mobile



如何在pandas中执行此操作?

您可以
np.在
axis=1
上对
id
related\u id
进行排序,并创建用于分组的辅助序列,然后使用辅助字典计算权重的
idxmin

s = pd.Series(map(tuple,np.sort(df[['id','related_id']].fillna(''),axis=1)))
d= {'desktop':1,'mobile':2}
out = df.loc[df['type'].map(d).groupby(s,sort=False).idxmin()]


我刚刚编辑了我的问题来更新ID。有些ID实际上是字符,而不是字符integers@Eisen更新了我的答案
print(out)

   id related_id     type
0  1e         2e  desktop
2  3x        NaN  desktop
3  4w         6w  desktop
4  5m        NaN   mobile
6  7q         8q   mobile