2017-09-12 241 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 
相关问题