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

2024-09-30 22:12:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图只选择同时具有这两个值的行。你知道吗

例如,我试图只选择一个左右耳柱都的患者。你知道吗

在这种情况下,它只能是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

enter image description here

代码会检索所有人,但我只尝试获取第0行和第1行,因为Lisa的左右两边都是ear。你知道吗


Tags: 数据代码nameimportright患者pandasdf
2条回答

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

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

   name    ear
0  Lisa  Right
1  Lisa   Left

你可以简化这个假设人类只能有两只耳朵;)

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

   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,并相应地选择。你知道吗

我正在使用filter

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(获取两个序列的交集)

s1=df.loc[df.ear=='Right','name']
s2=df.loc[df.ear=='Left','name']
df.loc[df.name.isin(s1[s1.isin(s2)]),]
Out[119]: 
   name    ear
0  Lisa  Right
1  Lisa   Left

相关问题 更多 >