Python 选择包含这两个值的行(包括)

Python 选择包含这两个值的行(包括),python,pandas,jupyter-notebook,Python,Pandas,Jupyter Notebook,我试图只选择同时具有这两个值的行 例如,我试图只选择一个耳柱左右两侧都有的患者 在本例中,它将仅为Lisa 下面是我试图获取正确数据的代码 import pandas as pd data = {'name': ['Lisa', 'Lisa', 'Mac', 'Intosh'], 'ear': ['Right','Left','Right','Left'] } df = pd.DataFrame(data, columns = ['name', 'ear']) df.loc[(

我试图只选择同时具有这两个值的行

例如,我试图只选择一个耳柱左右两侧都有的患者

在本例中,它将仅为Lisa

下面是我试图获取正确数据的代码

import pandas as pd

data = {'name': ['Lisa', 'Lisa', 'Mac', 'Intosh'],
    'ear': ['Right','Left','Right','Left']
   }

df = pd.DataFrame(data, columns = ['name', 'ear'])
df.loc[(df['name'] == 'Right') & (df['ear'] == 'Left')]
df


代码会检索所有人,但我尝试只获取第0行和第1行,因为Lisa的ear同时具有左、右两种功能。

我使用的是
过滤器

df.groupby('name').filter(lambda x : pd.Series(['Right','Left']).isin(x['ear']).all())
Out[106]: 
   name    ear
0  Lisa  Right
1  Lisa   Left
issubset

df.groupby('name').filter(lambda x : {'Right','Left'}.issubset(x['ear'].tolist()))
要修复代码,需要
isin
(获取两个系列的交点)


您的解决方案实际上需要使用
groupby
nunique

df[df.groupby('name')['ear'].transform('nunique') == df['ear'].nunique()]

   name    ear
0  Lisa  Right
1  Lisa   Left
假设人类只有两只耳朵,可以简化此过程;)


详细信息
groupby
将计算与名称相关的(唯一)ear条目数:

df.groupby('name')['ear'].transform('nunique')

0    2
1    2
2    1
3    1
Name: ear, dtype: int64
(前两行属于Lisa。)结果将广播到原始帧


然后检查哪些行的唯一计数为2,并相应地选择。

这是一个巧妙的转换。只是为了在转换后完成缩减(并且是学究式的),您需要一个df.name.unique()。@Will假设OP只想要有两只耳朵的人(可怜的梵高)的名字,而不是他们所在的行,您是对的。
df[df.groupby('name')['ear'].transform('nunique').eq(2)]

   name    ear
0  Lisa  Right
1  Lisa   Left
df.groupby('name')['ear'].transform('nunique')

0    2
1    2
2    1
3    1
Name: ear, dtype: int64