2017-09-12 3 views
0

내가 바로 처음 게시하지 않았다팬더 Dataframe은 : 여러 조건에 따라 생성 열이

미안 해요을 편집. 각 Lead ID의 항목이 두 개 뿐이고 Lead Status "A"인 솔루션이 제안되었습니다. 데이터를 변경하고 있습니다. 나는 다시 사과한다.

데이터 다음 Lead IDLead Status에 중복이있는 경우 그 LeadID 함께, "1"모든 Target 값을

:

Lead ID  Lead Status  Duration  Target 
1-1H9C0XL Too Small  -0.466177  1 
1-1H9G33C A    -0.620709  0 
1-1H9G33C A    -0.500709  0 
1-1H9G33C A    0.337401  0 
4-1HFORF8 No Fit   -0.343840  1 
4-1HFSXOG No Fit   -0.124920  1 
4-1HLQ2IJ A    -0.330962  0 
4-1HLQ2IJ A    0.130818  0 
4-1HLQ2IJ A    -0.400817  0 
4-1HLQ2IJ A    0.240818  0 

내가 다음 수행 할 더 짧은 Duration.

원하는 출력

Lead ID  Lead Status  Duration  Target 
1-1H9C0XL Too Small  -0.466177  1 
1-1H9G33C A    -0.620709  1 
1-1H9G33C A    -0.500709  1 
1-1H9G33C A    0.337401  0 
4-1HFORF8 No Fit   -0.343840  1 
4-1HFSXOG No Fit   -0.124920  1 
4-1HLQ2IJ A    -0.330962  1 
4-1HLQ2IJ A    0.130818  1 
4-1HLQ2IJ A    -0.400817  1 
4-1HLQ2IJ A    0.240818  0 

나는 중복 검사의 조건과 마지막 열을 업데이트하는 기간의 값을 구현할 수 없습니다입니다. 나는 많은 도움을 주셔서 감사합니다.

+0

그룹 중 가장 큰 것을 제외하고 모두 1이 되길 원하십니까? 그리고 가장 큰 것은 0이 될까요? –

+0

예, @TedPetrou –

답변

1

이가 (당신의 DF가 정렬 가정) 시도

df.loc[df[df.duplicated(['LeadID','LeadStatus'],keep=False)].drop_duplicates(['LeadID','LeadStatus'],keep='first').index,'Target']=1 
df 
Out[895]: 
     LeadID LeadStatus Duration Target 
0 1-1H9C0XL TooSmall -0.466  1 
1 1-1H9G33C   A -0.621  1 
2 1-1H9G33C   A  0.337  0 
3 4-1HFORF8  NoFit -0.344  1 
4 4-1HFSXOG  NoFit -0.125  1 
5 4-1HLQ2IJ   A -0.331  1 
6 4-1HLQ2IJ   A  0.241  0 

업데이트


df=df.sort_values(['LeadID','LeadStatus','Duration']) 

df.loc[df[df.duplicated(['LeadID','LeadStatus'],keep='last')].index,'Target']=1 

Out[911]: 
     LeadID LeadStatus Duration Target 
0 1-1H9C0XL TooSmall -0.466  1 
1 1-1H9G33C   A -0.621  1 
2 1-1H9G33C   A -0.501  1 
3 1-1H9G33C   A  0.337  0 
4 4-1HFORF8  NoFit -0.344  1 
5 4-1HFSXOG  NoFit -0.125  1 
8 4-1HLQ2IJ   A -0.401  1 
6 4-1HLQ2IJ   A -0.331  1 
7 4-1HLQ2IJ   A  0.131  1 
9 4-1HLQ2IJ   A  0.241  0 
+0

@KrishnangKDalal 고유 행에 1이 이미 있다고 가정 할 때만 작동합니다. –

+0

.loc 대신이 작업을 수행하는 훨씬 간단한 방법이 있습니다. 목표에 내부 코드를 추가하면됩니다. 내 대답을 참조하십시오 –

+0

Theres은 모든 열을 기준으로 정렬 할 필요가 없습니다. 인덱스의 자동 정렬은 데이터의 적절한 위치를 관리합니다. –

0

여기는 관용구적이고 능동적 인 답변입니다.

df['Target'] += df.sort_values('Duration')\ 
        .duplicated(subset=['Lead ID', 'Lead Status'], keep='last') 

고유 한 행에 1이 있다고 가정하지 않으면 다음을 수행 할 수 있습니다.

df1 = df.sort_values('Duration') 
unique = ~df1.duplicated(subset=['Lead ID', 'Lead Status'], keep=False) * 1 
first = df1.duplicated(subset=['Lead ID', 'Lead Status'], keep='last') * 1 
df['Target'] = unique + first 

그리고 덜 성능이 좋은 방법 :

df.groupby(['Lead ID', 'Lead Status'])['Duration']\ 
    .transform(lambda x: 1 if len(x) == 1 else x < x.max()) 

    Lead ID Lead Status Duration Target 
0 1-1H9C0XL Too Small -0.466177  1 
1 1-1H9G33C   A -0.620709  1 
2 1-1H9G33C   A -0.500709  0 
3 1-1H9G33C   A 0.337401  1 
4 4-1HFORF8  No Fit -0.343840  1 
5 4-1HFSXOG  No Fit -0.124920  1 
6 4-1HLQ2IJ   A -0.330962  1 
7 4-1HLQ2IJ   A 0.130818  1 
8 4-1HLQ2IJ   A -0.400817  1 
9 4-1HLQ2IJ   A 0.240818  0 
관련 문제