df = pd.DataFrame({'a':['x','x','x','x','x','y','y','y','y','y'],'b':['z','z','z','w','w','z','z','w','w','w'],'c':['c1','c2','c3','c1','c3','c1','c3','c1','c2','c3'],'d':range(1,11)})
a b c d
0 x z c1 1
1 x z c2 2
2 x z c3 3
3 x w c1 4
4 x w c3 5
5 y z c1 6
6 y z c3 7
7 y w c1 8
8 y w c2 9
9 y w c3 10
a
및의 모든 조합에 b
대해 동일한 값을 포함하는 행만 유지하려면 어떻게해야 c
합니까? 즉, c
일부 a
및 b
? 조합에만 있는 값이있는 행을 제외하는 방법 입니다 .
예를 들어, 전용 c1
및 c3
모든 조합에 존재 a
하고 b
( [x,z]
, [x,w]
, [y,z]
, [y,w]
)이므로 출력 될
a b c d
0 x z c1 1
2 x z c3 3
3 x w c1 4
4 x w c3 5
5 y z c1 6
6 y z c3 7
7 y w c1 8
9 y w c3 10
한 가지 방법이 있습니다. 그룹마다 고유의 목록을 가져 오기 한 후 사용하여 모든 반환 된 배열에서 공통 요소를 확인 reduce
하고 np.intersect1d
. 이어서 사용 dataframe 필터링 series.isin
및boolean indexing
from functools import reduce
out = df[df['c'].isin(reduce(np.intersect1d,df.groupby(['a','b'])['c'].unique()))]
고장:
s = df.groupby(['a','b'])['c'].unique()
common_elements = reduce(np.intersect1d,s)
#Returns :-> array(['c1', 'c3'], dtype=object)
out = df[df['c'].isin(common_elements )]#.copy()
a b c d
0 x z c1 1
2 x z c3 3
3 x w c1 4
4 x w c3 5
5 y z c1 6
6 y z c3 7
7 y w c1 8
9 y w c3 10
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다