2017-11-18 5 views
1

다음 샘플 데이터 프레임 d은 'col1'과 'col2'두 개의 열로 구성되어 있습니다. 전체 DataFrame d에 대한 고유 한 이름 목록을 찾고 싶습니다.팬더 데이터 프레임의 고유 문자열

d = {'col1':['Pat, Joseph', 
       'Tony, Hoffman', 
       'Miriam, Goodwin', 
       'Roxanne, Padilla', 
       'Julie, Davis', 
       'Muriel, Howell', 
       'Salvador, Reese', 
       'Kristopher, Mckenzie', 
       'Lucille, Thornton', 
       'Brenda, Wilkerson'], 

    'col2':['Kristopher, Mckenzie', 
      'Lucille, Thornton', 
      'Pete, Fitzgerald; Cecelia, Bass; Julie, Davis', 
      'Muriel, Howell', 'Harriet, Phillips', 
      'Belinda, Drake;David, Ford', 'Jared, Cummings;Joanna, Burns;Bob, Cunningham', 
      'Keith, Hernandez;Pat, Joseph', 'Kristopher, Mckenzie', 'Lucille, Thornton']} 

    df = pd.DataFrame(data=d) 

col1의 경우 unique() 함수를 사용하여 처리 할 수 ​​있습니다. 행들을 COL2 들어

len(df.col1) 10 # total number of rows 
len(df.col1.unique()) 9 # total number of unique rows 

df.col1.unique() 
array(['Pat, Joseph', 'Tony, Hoffman', 'Miriam, Goodwin', 
     'Roxanne, Padilla', 'Julie, Davis', 'Muriel, Howell', 
     'Salvador, Reese', 'Kristopher, Mckenzie', 'Lucille, Thornton', 
     'Brenda, Wilkerson'], dtype=object) 
세미콜론으로 분리 된 복수의 이름을 가지고있다. 예 : 'Pete, Fitzgerald; Cecelia, Bass; Julie, Davis'.

vector 작업을 사용하여 col2에서 고유 한 이름을 어떻게 얻을 수 있습니까? 실제 데이터 세트가 크기 때문에 for 루프를 피하려고합니다.

답변

3

먼저 split;s\*에 의해 (정규식 - 0 개 이상의 공백으로 ;) DataFrame로는 다음 Series 마지막으로 사용 unique에 대한 stack으로 바꿀 :

print (df['col2'].str.split(';\s*', expand=True).stack().unique()) 
['Kristopher, Mckenzie' 'Lucille, Thornton' 'Pete, Fitzgerald' 
'Cecelia, Bass' 'Julie, Davis' 'Muriel, Howell' 'Harriet, Phillips' 
'Belinda, Drake' 'David, Ford' 'Jared, Cummings' 'Joanna, Burns' 
'Bob, Cunningham' 'Keith, Hernandez' 'Pat, Joseph'] 

세부 사항 :

print (df['col2'].str.split(';\s*', expand=True)) 
         0    1    2 
0 Kristopher, Mckenzie   None    None 
1  Lucille, Thornton   None    None 
2  Pete, Fitzgerald Cecelia, Bass  Julie, Davis 
3  Muriel, Howell   None    None 
4  Harriet, Phillips   None    None 
5  Belinda, Drake  David, Ford    None 
6  Jared, Cummings Joanna, Burns Bob, Cunningham 
7  Keith, Hernandez  Pat, Joseph    None 
8 Kristopher, Mckenzie   None    None 
9  Lucille, Thornton   None    None 

print (df['col2'].str.split(';\s*', expand=True).stack()) 
0 0 Kristopher, Mckenzie 
1 0  Lucille, Thornton 
2 0  Pete, Fitzgerald 
    1   Cecelia, Bass 
    2   Julie, Davis 
3 0   Muriel, Howell 
4 0  Harriet, Phillips 
5 0   Belinda, Drake 
    1    David, Ford 
6 0   Jared, Cummings 
    1   Joanna, Burns 
    2   Bob, Cunningham 
7 0  Keith, Hernandez 
    1    Pat, Joseph 
8 0 Kristopher, Mckenzie 
9 0  Lucille, Thornton 
dtype: object 

대체 솔루션을 :

EDIT 0 : 모든 고유 이름에 대한

Series 양식의 모든 열 첫번째 stack을 추가

print (df.stack().str.split(';\s*', expand=True).stack().unique()) 

['Pat, Joseph' 'Kristopher, Mckenzie' 'Tony, Hoffman' 'Lucille, Thornton' 
'Miriam, Goodwin' 'Pete, Fitzgerald' 'Cecelia, Bass' 'Julie, Davis' 
'Roxanne, Padilla' 'Muriel, Howell' 'Harriet, Phillips' 'Belinda, Drake' 
'David, Ford' 'Salvador, Reese' 'Jared, Cummings' 'Joanna, Burns' 
'Bob, Cunningham' 'Keith, Hernandez' 'Brenda, Wilkerson'] 
+2

'df.col2.str.split (을 ';'= 진정한 확장) .stack을() .unique()'내가 올 때 이것이 내 해결책이었다 :(. Arghh는 다음 번에 빨리 와야합니다 – Dark

+0

빠른 해결책을 가져 주셔서 감사합니다. 쉬운 일 이니 다른 사람에게 물어볼 것입니다. 위의 데이터 프레임에서 고유 한 이름을 모두 찾는 방법은 무엇입니까? – ravi

+0

수정 된 답변을 확인하십시오. – jezrael

관련 문제