2016-12-24 2 views
2

다음과 같이 나는 팬더 dataframe이 : 안 COL_1COL_2을 (VAL_1 :열을 기준으로 행을 필터링 자동화하는 방법

df = 

COL_1 COL_2 VAL_1 
ABC  AAA  ABC 
CDE  CDE  RTY 
ABC  ABC  RTY 
ABC  RTY  DEF 

내가 COL로 시작하는 열에서 고유 한 값을 포함하는 행의 수를 caculate 할 익숙한).

예상 결과는 다음

GROUP COUNT 
ABC  3 
CDE  2 
RTY  1 
AAA  1 

한가지 가능성 수동 열 이름을 지정하고 수동 GROUP 모든 가능한 값을 특정 행의 수를 계산하는 것이다. 그러나 분명히이 솔루션은 GROUP의 열과 값의 수가 많으면 좋지 않습니다.

자동으로 수행하는 방법? 나는이 접근법이 COL으로 시작하는 열의 튜닉 값을 가진 모든 행을 필터링해야한다고 생각합니까?

나는 이것을 시도했지만 1Gb의 데이터 세트에서 오랜 시간이 걸리며 잘못된 결과가 나왔다. 또한 GROUP의 값을 지정하는 것을 피하는 방법을 모르겠습니다. str.contains('ABC').

t_cols = [c for c in df.columns.values if not c.startswith('COL')] 
aa = df.drop(t_cols,axis=1) 
aa.apply(lambda row: row.astype(str).str.contains('ABC').any(), axis=1).shape 

답변

5

또는 당신은 사용할 수 있습니다 value_counts() :

df.filter(regex = "^COL").stack().value_counts() 

#ABC 4 
#CDE 2 
#AAA 1 
#RTY 1 
#dtype: int64 
+1

그래,이 솔루션이 더 낫다! :) – MaxU

+0

좋은 해결책입니다. 그런데이 코드에 조건을 추가하는 방법을 알고 있습니까? 칼럼'VAL_1'의 값이'ABC'와 같다고 생각할 때 행을 셀 수 있다면 어떻게 될까요? – Dinosaurius

+0

가지고있는 행의 수를 세는 것을 의미한다면,'shape [0]'을 사용할 수 있고, 또한 논리적 인 인덱스를 사용하여 조건이있는 행을 선택할 수 있습니다. 문법은 필요한 것에 따라'df [df.VAL_1 == "ABC"]. filter (regex = "^ COL"). shape [0]'과 같은 것이 될 것입니다. – Psidom

2

이게 원하는가요?

In [12]: df.filter(like='COL_').stack().to_frame('COL').groupby('COL').size() 
Out[12]: 
COL 
AAA 1 
ABC 4 
CDE 2 
RTY 1 
dtype: int64 
관련 문제