2017-09-12 240 views
0

編輯熊貓數據框中:根據多個條件創建列

我很抱歉,我沒有將它張貼在第一時間。如果每個Lead IDLead Status「A」只有兩個條目,則建議的解決方案起作用。我正在改變我的數據。我再次道歉。

數據:

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 

我想做到以下幾點:

如果在Lead IDLead Status重複,使所有的Target值 「1」 爲LeadID與較短的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 
相關問題