2016-08-08 18 views
1

ich folgende Datenrahmen haben:unter Verwendung einer Maske Berechnung

DATA   Price1   Price2    Price3 
sys dis 
27 0.8   43.89   83.06   33.75 
    0.9   2.56   12.19   2.48 
    1.0   42.28   1.87    1.93 
    1.2   22.70   1.41    3.64 
    1.4   20.38   1.36    2.02 
28 0.8   22.024   35.47   16.96 
    0.9   2.69   36.41   19.33 
    1.0   59.30   8.90    11.41 
    1.2   25.08   4.55    11.99 
    1.4   26.85   3.30    7.37 
    1.6   437.82   3.50    5.65 
    1.8   55.21   2.91    1.84 
    2.0   32.54   4.68    5.03 
    2.5   52.91   5.42    6.58 

I mean Preise für dis < 1.0 und separat für dis > 1.0 berechnen müssen.

Ich habe versucht, eine Maske zu erstellen:

def mask(df): 
     df.loc[df.index.get_level_values('dis').between(0.8,1.0), 'Price1'].mean() 
     df.loc[df.index.get_level_values('dis').between(1.0,2.6), 'Price1'].mean() 
     return df 

print (df_new.ix[:,'Price1']).apply(mask) 

Thought Ich erhalte die folgende Fehlermeldung:

AttributeError: ("'Float64Index' object has no attribute 'between'").

Antwort

2

Sie könnten verwenden boolean Komparatoren:

mean_low = df.loc[(df.index.get_level_values('dis') < 1.0), 'Price1'].mean() 
mean_high = df.loc[(df.index.get_level_values('dis') > 1.0), 'Price1'].mean() 
0

einfachste Lösung ist

df['price_low']=df.ix[df.reset_index()['dis'] < 1,'price'] 
df['price_high']=df.ix[df.reset_index()['dis'] > 1, 'price'] 

df.price_low.mean() 
df.price_high.mean() 
0

IIUC:

idx_s = df.index.to_series() 
lvl1 = idx_s.str.get(0) 
gt_1 = np.where(idx_s.str.get(1) > 1, 'GT_1', 'LE_1') 
df.groupby([lvl1, gt_1]).mean() 

enter image description here

Verwandte Themen