2017-01-30 1 views
2

Für den Datenrahmen unten, muss ich eine neue Spalte 'unit_count' erstellen, die 'Einheit'/'count' für jedes Jahr und jeden Monat ist. Da jedes Jahr und jeder Monat nicht eindeutig ist, möchte ich für jeden Eintrag nur die Anzahl für einen bestimmten Monat aus der Option B verwenden.Iterieren durch Pandas Dataframe zum Berechnen basierend auf den Bedingungen

key UID count month option unit year 
0 1 100  1  A  10  2015 
1 1 200  1  B  20  2015 
2 1 300  2  A  30  2015 
3 1 400  2  B  40  2015 

Im Grunde brauche ich eine Funktion, die die folgenden:

unit_count = df.unit/df.count 

für Wert der Einheit, aber mit dem nur die ‚Zählung‘ Wert der Option ‚B‘ in der gegebenen ‚Monat‘ .

So würde das Endergebnis wie in der Tabelle unten aussehen, wobei unit_count die Anzahl der Einheiten durch die Anzahl von 'Sektor' 'B' für einen bestimmten Monat dividiert.

key UID count month option unit year unit_count 
0 1 100  1  A  10  2015 0.05 
1 1 200  1  B  20  2015 0.10 
2 1 300  2  A  30  2015 0.075 
3 1 400  2  B  40  2015 0.01 

Hier ist der Code, den ich die Original-Datenrahmen erstellt haben:

df = pd.DataFrame({'UID':[1,1,1,1], 
       'year':[2015,2015,2015,2015], 
       'month':[1,1,2,2], 
       'option':['A','B','A','B'], 
       'unit':[10,20,30,40], 
       'count':[100,200,300,400] 
       }) 

Antwort

1

Es scheint, dass Sie zuerst NaN schaffen kann, wo nicht optionB ist und dann NaN Werten gefüllt teilen zurück:

Hinweis: DataFrame muss nach year, month und option fi sortiert werden rst für letzten Wert mit B für jede Gruppe

#if necessary in real data 
#df.sort_values(['year','month', 'option'], inplace=True) 

df['unit_count'] = df.loc[df.option=='B', 'count'] 
print (df) 
    UID count month option unit year unit_count 
0 1 100  1  A 10 2015   NaN 
1 1 200  1  B 20 2015  200.0 
2 1 300  2  A 30 2015   NaN 
3 1 400  2  B 40 2015  400.0 

df['unit_count'] = df.unit.div(df['unit_count'].bfill()) 
print (df) 
    UID count month option unit year unit_count 
0 1 100  1  A 10 2015  0.050 
1 1 200  1  B 20 2015  0.100 
2 1 300  2  A 30 2015  0.075 
3 1 400  2  B 40 2015  0.100 
+0

Arbeitete wie angekündigt, vielen Dank! – christofern

Verwandte Themen