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

时间:2019-05-15 20:06:23

标签: python pandas jupyter-notebook

我试图仅选择同时具有两个值的行。

例如,我尝试仅选择“ 左右在耳朵上右和左”的患者。

在这种情况下,只会是 Lisa

这是我试图获取正确数据的代码。

[{'name00': 'test2', 'name01': 'test1'},
 {'name00': 'test3', 'name01': 'test1'},
 {'name00': 'test3', 'name01': 'test2'},
 {'name00': 'test5', 'name01': 'test4'}]

enter image description here

该代码可检索所有人,但我试图只获取第0行和第1行,因为Lisa的耳朵有左右左右。

2 个答案:

答案 0 :(得分:4)

您的解决方案实际上需要使用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将根据名称计算(唯一的)耳朵项的数量:

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

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

(前两行属于Lisa。)结果广播到原始帧。

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

答案 1 :(得分:3)

我正在使用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