2017-10-24 4 views
1

Ich habe eine Daten-Bond-Markt wie folgt aus:wie min und max von zwei separaten Spalten zusammenfassen in einer Spalte

Id row  Date  BuyPrice SellPrice 
1 1  2017-10-30 94520  0 
1 2  2017-10-30 94538  0 
1 3  2017-10-30 94609  0 
1 4  2017-10-30 94615  0 
1 5  2017-10-30 94617  0 
1 1  2017-09-20 99100  99059 
1 1  2017-09-20 98100  99090 
2 1  2010-11-01 99890  100000 
2 2  2010-11-01 99899  100000 
2 3  2010-11-01 99901  99899 
2 4  2010-11-01 99920  99850 
2 5  2010-11-01 99933  99848 

ich den niedrigsten Verkaufspreis und höchste Kaufpreis für jede ID wählen möchten und berechnen ihre Subtraktion, aber wenn ein Minimum des Verkaufs oder des Preises Null ist, möchte ich eine Ausnahme machen und dieses Datum fallen lassen.

Und geben Sie auch jeder ID einen Index nach Datum. bedeutet für den ersten Tag jedes geben 1 und zweiten Tag geben 2 und so weiter.

Endlich Daten sollte wie folgt sein:

Id Date highest buy price  lowest sell price  NBBO(highest buy price - lowestSellPrice)Index 

1  2017-10-30 94520     0      NaN         1 
1  2017-09-20 99100     99059     41         2  
2  2017-11-01 99890     99848     42         1 

Antwort

0

Sie groupby und Aggregat min und max und dann numpy.where für NaN s durch Bedingung verwenden können. Letzte Nutzung cumcount:

df = df.groupby(['Id','Date'], sort=False).agg({'BuyPrice':'max','SellPrice':'min'}) 
df['NBBO'] = np.where(df[['BuyPrice', 'SellPrice']].eq(0).any(1), 
         np.nan, 
         df['BuyPrice'] - df['SellPrice']) 
df['index'] = df.groupby(level=0).cumcount() + 1 

d = {'BuyPrice':'highest buy price','SellPrice':'lowest sell price'} 
df = df.reset_index().rename(columns=d) 
print (df) 

    Id  Date highest buy price lowest sell price NBBO index 
0 1 2017-10-30    94617     0 NaN  1 
1 1 2017-09-20    99100    99059 41.0  2 
2 2 2010-11-01    99933    99848 85.0  1 

Detail:

#comapre with 0 eq is same as == 
print (df[['BuyPrice', 'SellPrice']].eq(0)) 
       BuyPrice SellPrice 
Id Date       
1 2017-10-30  False  True 
    2017-09-20  False  False 
2 2010-11-01  False  False 

#get at least one True per row by any(1) 
print (df[['BuyPrice', 'SellPrice']].eq(0).any(1)) 
Id Date  
1 2017-10-30  True 
    2017-09-20 False 
2 2010-11-01 False 
dtype: bool 
Verwandte Themen