Python 选择包含这两个值的行(包括)
我试图只选择同时具有这两个值的行 例如,我试图只选择一个耳柱左右两侧都有的患者 在本例中,它将仅为Lisa 下面是我试图获取正确数据的代码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[(
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