被修改
对不起,我没有在第一时间发布它。如果每个Lead ID
只有两个条目Lead 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 ID
和Lead 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
。
所需输出
{{1}}
我无法实现检查重复项的条件以及更新最后一列的持续时间值。我很感激任何帮助。
答案 0 :(得分: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
答案 1 :(得分: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