2017-01-11 1 views
0

특정 열 내의 목록을 기반으로 데이터 프레임에 새 열을 추가해야합니다. 새 열은 열의 모든 목록에서 파생 된 집합이어야합니다.열 값을 파싱하여 데이터 프레임에 대한 새 열을 만들고 다른 열의 값으로 새 열을 채 웁니다.

다음 첫 번째 목록에 해당하는 다른 열이 있지만 데이터가 약간 다릅니다. 값이 아닌 경우 나는 새 열을 채우기 위해이 값이 필요 목록 여기

"를 포함하지 않는 것은"예입니다

 Disease        Status 
0 Asthma|ARD       Ph II|Ph I 
1 Arthritis|Inflammation|Asthma  Ph III|Approved|No development reported 

이것은이되어야 :

Disease      Status        Asthma  ARD  Arthritis  Inflammation 
0 Asthma|ARD      Ph II|Ph I      Ph II   Ph I 
1 Arthritis|Inflammation|Asthma Ph III|Approved|No development        Ph III   Approved 

여기에 "포함하지 마십시오"의 목록은 단지 [ '발전 없음']이지만 여기에 포함시키려는 용어가 더 있습니다.

내가 사용하고있는 데이터 프레임에는 많은 컬럼이 있는데, 효율적인 방법으로이 작업을 수행 할 수있는 df, 열 이름 및 "안 함"목록을 전달할 수있는 기능을 개발하는 데 관심이 있습니다. (이상적으로 또는 거의 루프가없는).

현재 나는 Disease 열에서 집합을 만들고 pd.concat을 통해 데이터 프레임에 추가 한 다음 각 행을 반복하고 두 열의 값을 분할 한 다음 "Disease"목록을 반복합니다 질병 기둥에 올바른 지위를 두는 것.

이 문제는 내 데이터 프레임이 ~ 12k 행이므로 예외적으로 시간이 많이 걸리는 문제입니다.

+2

은 어디이를 구현하기 위해 시도하고, 무엇을 정확하게 문제가있다 그것으로? – jonrsharpe

+0

현재 접근법으로 업데이트되었습니다. 지금 당장 정확한 코드를 파내는 것처럼 보이지 않을 수 있습니다. 내일 시도 할 수 있습니다. 문제는 그것이 효율적이지 않다는 것입니다. – wingsoficarus116

답변

2

이전의 질문과 현재 질문에서 각각의 셀에 여러 값이있는 것 같습니다. 먼저 데이터를 정리하고 분석을 계속하는 것이 훨씬 쉬울 것입니다. 자체 셀의 각 열에 각 값을 넣으십시오.

df1 = pd.concat([df[col].str.split('|', expand=True).stack().reset_index(1, drop=True) for col in df.columns], axis=1) 

출력은 약

cols = ['Asthma', 'ARD'] 
df2 = df1.reset_index().pivot(index='index',columns=0, values=1)[cols] 

출력의 상관 여기에서이 피벗에만 열을 선택할 수 있습니다 다음 df1

   0      1 
0  Asthma     Ph II 
0   ARD      Ph I 
1  Arthritis     Ph III 
1 Inflammation     Approved 
1  Asthma No development reported 

의 그리고 df2

0      Asthma ARD 
index 
0      Ph II Ph I 
1  No development reported None 

그런 다음 단지 set

  • str.extractall이 스타일의 선택이었다 원래

    pd.concat((df, df2),axis=1) 
    
              Disease         Status \ 
    index 
    0       Asthma|ARD        Ph II|Ph I 
    1  Arthritis|Inflammation|Asthma Ph III|Approved|No development reported 
    
             Asthma ARD 
    index 
    0      Ph II Ph I 
    1  No development reported None 
    
  • +0

    이 솔루션을 구현했지만 오류가 계속 발생합니다. ValueError : 인덱스에 중복 항목이 포함되어 있습니다. 다시 형성 할 수 없습니다. 위의 방법이 내 데이터 프레임의 큰 하위 집합에서 작동하는 이유는 확실하지 않습니다. 도움이되는 생각이 있습니까? – wingsoficarus116

    +0

    @ wingsoficarus116 각 인덱스마다 중복 된 질병이있을 것입니다 (천식은 인덱스 0 또는 그와 비슷한 것으로 두 번 나타납니다). 다음 코드를 실행하십시오. 가장 높은 값은 1이어야합니다. 문제가 아닌 경우. sort_values ​​(1, ascending = False)' –

    +0

    'print (temp_df.groupby ([pd.Grouper (level = 0), 0]), '0'). count(). sort_values ​​(1, ascending = False))'그러나 이것은 나를 준다 :'AttributeError : 'Int64Index'객체는 'labels'속성을 가지고 있지 않다. 여러 인덱스에서 "Asmtha"를 갖지만 "천식"이 두 번 (즉, 같은 인덱스) 있습니다. – wingsoficarus116

    1
    • 메이크업 제외 목록이 DataFrame을 연결.str.split
    • query은 포함하지 아니하는 것들을 없애 빨라집니다
    • join

    dont_include = set(['No development']) 
    
    d1 = df.stack().str.extractall('([^|]+)')[0].unstack(1) \ 
         .reset_index(1, drop=True).query('Status not in @dont_include') \ 
         .set_index('Disease', append=1).Status.unstack().fillna('') 
    
    df.join(d1) 
    

    enter image description here

    +0

    이 버전도 구현하려고하지만 다음과 같이 계속 나타납니다. AssertionError : 전달 된 데이터가 1 ​​개이고 전달 된 데이터의 데이터 수가 1554 개임 왜 이럴 수 있습니까? – wingsoficarus116

    관련 문제