2017-05-23 1 views
1

작은 문제가 있습니다. DataFrame에 여러 행이 있고 각 행에 다음으로 시작하는 하나 이상의 값이 들어 있습니다. 'M'문자 다음에 3 자리 숫자. 값이 1보다 크면 쉼표로 구분됩니다. DataFrame의보기를 인쇄하고 싶습니다. 그 중 하나의 열에는 지정한 값이있는 행만 있습니다 (예 : 목록에서 [M111 ','M222 ']의 항목을 보유하기를 원합니다.) 시작했습니다. 다음과 같은 방법으로 내 부울 마스크를 구축 :열의 각 행에있는 값 목록에 대한 팬더 .isin()

df[df['Column'].apply(lambda x: x.split(', ').isin(['M111', 'M222']))] 

을 내 마음 속에서, .apply() .split() '열'이 1 개 이상의 값과 각 행의 목록에 값이 첫 번째 변환의 방법과 .isin() 메서드는 각 행의 항목 목록에있는 항목 중 하나가 [[M111], [M222]]의 지정된 값 목록에 있는지 여부를 확인합니다. 실제로는 원하는보기를 가져 오는 대신 DataFrame의 오류가 발생했습니다.

'TypeError: unhashable type: 'list' 

내가 뭘 잘못하고 있니?

종류와 관련, Greem

+0

목록에 isin 메서드를 적용하고 있습니다 (x.split()의 결과). 데이터 프레임이나 시리즈 객체에 isin 메소드를 적용합니다. – plasmon360

답변

3

난 당신이 필요하다고 생각 :

df2 = df[df['Column'].str.contains('|'.join(['M111', 'M222']))] 
+0

그것은 아름답게 일했습니다 - 감사합니다 jezrael : – Greem666

+0

고마워요. 좋은 날! – jezrael

2

당신은 단지 팬더 객체로 isin() 방법에 액세스 할 수 있습니다. 그러나 split()은 목록을 반환합니다. Seriessplit()을 포장하는 것은 작동합니다

# sample data 
data = {'Column':['M111, M000','M333, M444']} 
df = pd.DataFrame(data) 

print(df) 
     Column 
0 M111, M000 
1 M333, M444 

이제 Seriessplit() 포장.
isin()split()에서 나오는 각 요소에 대해 하나씩 부울 값 목록을 반환합니다. "목록의 항목 중 이 지정된 값 목록에 있는지 여부"를 알고 싶으므로 apply 함수에 any()을 추가하십시오.

df[df['Column'].apply(lambda x: pd.Series(x.split(', ')).isin(['M111', 'M222']).any())] 

출력 : 다른 사람이 지적했듯이

 Column 
0 M111, M000 

, 최종 목표를 달성 대해 갈 수있는 간단한 방법이있다. 하지만이 문제는 isin()과 관련된 문제를 해결하는 방법입니다.

+0

이것이 어떻게 복잡한 접근법인지 알 수 있습니다. str.contains() 메서드를 사용하면 빠르고 쉽게 작업 할 수 있습니다. 하지만 호기심을 만족시키기 위해 lambda x를 적용했을 때의 효과를 알려주십시오 : pd.Series (x.split (','))를 'Column'열에? 해당 열의 각 행이 쉼표로 구분 된 각 문자열에 많은 값이 포함되어있는 것처럼 많은 열이있는 Series 개체로 변환되는 것처럼 보입니까? – Greem666

관련 문제