我试图仅选择同时具有两个值的行。
例如,我尝试仅选择“ 左右在耳朵上右和左”的患者。
在这种情况下,只会是 Lisa 。
这是我试图获取正确数据的代码。
[{'name00': 'test2', 'name01': 'test1'},
{'name00': 'test3', 'name01': 'test1'},
{'name00': 'test3', 'name01': 'test2'},
{'name00': 'test5', 'name01': 'test4'}]
该代码可检索所有人,但我试图只获取第0行和第1行,因为Lisa的耳朵有左右左右。
答案 0 :(得分:4)
您的解决方案实际上需要使用groupby
和nunique
:
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