J'ai le DataFrame suivant:

   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

Je dois calculer les mean prix pour dis < 1.0 et séparément pour dis > 1.0.

J'ai essayé de créer une fonction de masque:

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)

Je pensais que j'obtiens l'erreur suivante:

AttributeError: ("L'objet 'Float64Index' n'a pas d'attribut 'entre'").

1
Monica 8 août 2016 à 19:15

3 réponses

Meilleure réponse

Vous pouvez utiliser des comparateurs booléens:

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()
2
Nickil Maveli 8 août 2016 à 17:06

La solution la plus simple est

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
ℕʘʘḆḽḘ 8 août 2016 à 16:22

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

0
piRSquared 8 août 2016 à 17:22