2016-07-31 25 views
2

Ich führe eine mehrdimensionale Suche durch, um einen Wert in einer neuen Spalte zuzuweisen.So wenden Sie eine Funktion auf einen mehrfach codierten Pandas-Datenrahmen an

Ich habe eine Tabelle mit einigen historischen Mitarbeiterdaten nach Monat. In diesem Beispiel gibt es zwei eindeutige Personen, und sie können mehrere Jobs innerhalb eines Monats haben.

Ich möchte eine neue Spalte erstellen, die mir sagt, ob jede eindeutige Person einen geeigneten Job hat, basierend auf den folgenden Bedingungen. Die Herausforderung besteht darin, dass jede Zeile nach Monat/Jahr betrachtet werden muss.

import pandas as pd 
import numpy as np 

data = {'Month': ["January", "January", "January", "February", "February", "February", "March", "March", "March", "March"], 
     'Year': [2015,2015,2015,2015,2015,2015,2016,2016,2016,2016], 
     'Job #': [1,1,2,1,2,1,1,1,2,3], 
     'Pay Group': ["Excluded","Included","Excluded","Excluded","Included","Included","Excluded","Exclcuded","Excluded","Included"], 
     'Name': ["John","Bill","Bill","John","John","Bill","John","Bill","Bill","Bill"]} 
df = pd.DataFrame(data, columns=['Month', 'Year', 'Job #', 'Pay Group', 'Name']) 

df 

Eligible Jobs Bedingungen:

  • Wenn (Job # = 1 UND Pay Group = Include) und wenn die vorherige Bedingung falsch ist, dann sucht die nächstgrößere Job # innerhalb der gegebenen month/year UND Pay Group = Enthält

Output

Antwort

0

IIUC:

Sie möchten für jede Person innerhalb jedes Monats/Jahres den kleinsten Job #, so dass Pay Group == Included.

Filter nur diejenigen, die enthalten sind. Nach Jobnummer sortieren. Gruppieren nach Jahr, Monat und Name unter Berücksichtigung des Index der Mindestobservation. Verwenden Sie dies, um eine neue Spalte zuzuweisen.

dfi = df[df['Pay Group'] == 'Included'].sort_values('Job #') 
gc = ['Year', 'Month', 'Name'] 
idx = dfi.groupby(gc, as_index=False)['Job #'].idxmin() 
df['Eligible Job'] = 'Not Eligible' 
df.ix[idx] = 'Eligible' 

df 

enter image description here

+0

Dank piRSquared. Das filterte großartig. Es gibt einen anderen Teil dazu ... Ich brauche dies, um eine neue Spalte zu erstellen, die diese als geeignete Jobs kennzeichnet, z. "Geeigneter Job": "Teilnahmeberechtigt"/"Nicht berechtigt". Auch, nachdem dies erledigt ist, wie setze ich die groupby zurück, damit ich zur vollen Tabelle zurückkommen kann? – Christopher

+0

@Christopher Post wurde aktualisiert. – piRSquared

+0

fast da. Es sieht so aus, als ob der Code die ursprünglichen Zeilen für "Berechtigt" überschrieben hat. Ich möchte die ursprüngliche Tabelle beibehalten, habe aber nur die Spalte "Geeigneter Job" = "Teilnahmeberechtigt" oder "Nicht berechtigt". – Christopher