Pandas数据帧选择列表列包含特定元素集的行



这是以下文章的后续内容:Pandas数据帧选择列表列包含字符串列表的行

我希望能够从选择列表中选择包含精确字符串对的行(其中selection=['cat','dog'](。

启动df:

molecule            species
0        a              [dog]
1        b       [horse, pig]
2        c         [cat, dog]
3        d  [cat, horse, pig]
4        e     [chicken, pig]

df我想要:

molecule            species
2        c         [cat, dog]

我尝试了以下操作,但它只返回列标签。

df[pd.DataFrame(df.species.tolist()).isin(selection).all(1)]

一种方法:

df['joined'] = df.species.str.join(sep=',')
selection = ['cat,dog']
filtered = df.loc[df.joined.isin(selection)]

这不会发现具有不同排序的情况(即'dog,cat''horse,cat,pig'(,但如果这不是问题,那么它可以正常工作。

这会找到任何东西。

import pandas as pd
selection = ['cat', 'dog']
mols = pd.DataFrame({'molecule':['a','b','c','d','e'],'species':[['dog'],['horse','pig'],['cat','dog'],['cat','horse','pig'],['chicken','pig']]})
mols.loc[np.where(pd.Series([all(w in selection for w in mols.species.values[k]) for k in mols.index]).map({True:1,False:0}) == 1)[0]]

如果您想找到任何至少包含列表中元素的行(也可能包含其他元素(,请使用:

mols.loc[np.where(pd.Series([all(w in mols.species.values[k] for w in selection) for k in mols.index]).map({True:1,False:0}) == 1)[0]]

这是矩阵作为选择器的一个有趣的应用。使用转置的摩尔来乘以零和一的矢量,这些矢量指向摩尔中符合您标准的行:

mols.to_numpy().T.dot(pd.Series([all(w in mols.species.values[k] for w in selection) for k in mols.index]).map({True:1,False:0}))

另一个(更可读的(解决方案是将条件为True的列分配给mols,将其映射到0和1,并查询该列等于1的mols。

最新更新