2017-03-23 2 views
1

나는 소문자 문자열 목록뿐만 아니라 열 이름에 대해서도 다양한 경우가있는 문자열이있는 데이터 프레임을 가지고 있습니다.팬더의 목록에서 열 일치 중 케이스 유지

a = [5, 5, 4, 6] 
b = [4, 4, 4, 4] 
c = [6, 8, 2, 3] 
d = [8, 6, 4, 3] 

df = pd.DataFrame({'a': a, 
        'B_B': b, 
        'CC_Cc': c, 
        'Dd_DdDd': d}) 

cols = ['b_b', 'cc_cc', 'dd_dddd'] 

df에서 열의 대소 문자를 보존하면서 col의 문자열과 일치하는 열을 df에서 선택하려고합니다. 열 이름을 모두 소문자로 지정하여 일치시킬 수 있었지만 데이터 프레임 열의 원래 사례를 저장하는 방법을 잘 모르겠습니다.

이 경우에는 유지 col에서 df의 열만있는 새로운 데이터 프레임을 만들고 싶지만 원래의 경우는 그대로 유지하고 싶습니다. 이 일을 어떻게 하죠?

원하는 출력 :

B_B CC_Cc Dd_DdDd 
0 4  6  8 
1 4  8  6 
2 4  2  4 
3 4  3  3 

답변

2

당신은 열을 선택한 후 isin 방법과 논리적 시리즈를 구성하는 경우를 낮추기 위해 열 이름을 변환 할 str.lower()을 사용할 수 있습니다; 열 이름이 방식으로 변경 될 것이다

df.filter(regex="(?i)" + "|".join(cols)) 

:

df.loc[:, df.columns.str.lower().isin(cols)] 

enter image description here

대안 방법의 경우 무시 개질제 (?i)를 지정 정규식에 filter 함수를 사용하는 것 enter image description here

이 regex 메서드가 패턴을 포함하는 열 이름과도 일치합니다. n이 cols 목록에있는 경우 정확하게 일치하는 대소 문자를 구분하려면 단어 경계를 추가 할 수 있습니다.

df.filter(regex="(?i)\\b"+"\\b|\\b".join(cols)+"\\b") 
+0

굉장! 이 두 가지 방법 모두 매력처럼 작동합니다. 실행 시간은 어떻게 비교됩니까? 꽤 큰 데이터 세트 (수천 개의 행이있는 수백 개의 열)에서이 함수를 사용할 것입니다. – Nizag

+1

나는 효율성에 관해서 그다지 걱정하지 않을 것이다. 수백/수천 개의 열/행은 전체 데이터 프레임이 아니라 여기서 만 인덱스를 확인하기 때문에 그렇게 중요하지 않습니다. 그래서 나는 당신이 선호하는 것을 제안 할 것입니다. – Psidom