2017-09-07 4 views
0

je l'df suivante:python pandas géants: valeur de recherche dans une colonne conditionnée autre colonne

Customer | transaction_id | medium | first_transaction_flag 
ABC  12345   organic  Y      
ABC  23456   email  0      
ABC  34567   organic  0         
BCD  45678   organic  0      
BCD  56789   referral  0      

je besoin d'ajouter une colonne avec le premier support réel. Ceci est le produit final Je cherche:

Customer | transaction_id | medium | first_transaction_flag | first_medium 
ABC  12345   organic  Y      organic 
ABC  23456   email  0      organic     
ABC  34567   organic  0      organic       
BCD  45678   organic  0      0   
BCD  56789   referral  0      0 

Fondamentalement, quelle que soit la valeur de la colonne « moyenne » pour une transaction qui a « first_transaction_flag » = Y, copiez cette valeur pour toutes les transactions pour ce client la colonne "first_medium".

Je pense que je suis vraiment proche de la résoudre avec l'aide de l'une des réponses précédentes de @piSquared.

df['first_medium'] = df.lookup(df.Customer, df.medium) 

Mais pas sûr de savoir comment combiner cela avec une déclaration np.where pour first_transaction_flag == « Y »

Alors désolé si cela a été demandé avant, je ne pouvais pas trouver

Répondre

1

Première obtenir le premier moyen dans une série indexée par le client:

first_medium = df.loc[ 
    df['first_transaction_flag'] == 'Y', 
    ['Customer', 'medium'] 
].set_index('Customer')['medium'] # makes it a series 

faire ensuite la recherche:

df['first_medium'] = first_medium.loc[df['Customer']].fillna(0).values 

La dernière .values est nécessaire afin que l'affectation ne soit pas effectuée par index.

+0

merci! Je reçois une erreur de syntaxe à propos de] devant .set_index; quand j'essaie d'en ajouter un autre [à l'avant, il me dit "trop ​​de valeurs à déballer" – jeangelj

+0

merci - la première déclaration fonctionne maintenant; pour la deuxième déclaration je reçois le ValueError: Longueur des valeurs ne correspond pas à la longueur de l'index – jeangelj

+0

argh, a oublié de faire une série plutôt que d'une base de données, fixe (et double cette fois, cela devrait fonctionner!) – IanS