![](/img/trans.png)
[英]Creating a new column in dataframe based on multiple conditions from other rows and columns? Including rows that are null? - Python/Pandas
[英]Pandas Dataframe: Creating column based on multiple conditions
編輯
抱歉,我第一次沒有正確發布。 如果每個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
重復, LeadID
Duration
較短的該LeadID
所有Target
都設置為“ 1”。
期望的輸出
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
我無法實現檢查重復項和持續時間值以更新最后一列的條件。 非常感謝您的協助。
試試這個(假設您的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
這是一個慣用且高效的答案。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.