2017-09-12 7 views
0

に基づいて作成コラム編集パンダデータフレーム:複数の条件

私は右の初めてそれを投稿しませんでしたごめんなさい。それぞれのLead IDのエントリが2つしかなく、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