Среднее по группам, после резки по переменной - PullRequest
1 голос
/ 04 марта 2020

Я хочу иметь столбец, который ссылается на среднее значение переменной X в групповом порядке, используя только строки, которые проходят разрез по переменной Y.

Я сделал это с небольшим количеством обходного пути, поэтому мне интересно, есть ли более простой способ добиться этого.

df = pd.DataFrame({'Animal': ['Falcon', 'Falcon', 'Falcon', 'Parrot', 'Parrot','Parrot'],
                   'Max_Speed': [380., 370., 90, 24., 100., 101]})

df['meanWithCut'] = df.query('Max_Speed>98').groupby('Animal').transform('mean')

df['meanWithCut'] = df.groupby('Animal')['meanWithCut'].apply(lambda x: x.fillna(x.max()))

df

    Animal  Max_Speed   meanWithCut
0   Falcon  380.0       375.0
1   Falcon  370.0       375.0
2   Falcon  90.0        375.0
3   Parrot  24.0        100.5
4   Parrot  100.0       100.5
5   Parrot  101.0       100.5

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Вы можете map:

df['meanWithCut'] = (df['Animal'].map(df.query('Max_Speed>98')
                    .groupby('Animal')['Max_Speed'].mean()))
print(df)

   Animal  Max_Speed  meanWithCut
0  Falcon      380.0        375.0
1  Falcon      370.0        375.0
2  Falcon       90.0        375.0
3  Parrot       24.0        100.5
4  Parrot      100.0        100.5
5  Parrot      101.0        100.5
2 голосов
/ 04 марта 2020

Если вам нужен фильтр перед назначением, я сделаю agg, затем сопоставлю

s = df.query('Max_Speed>98').groupby('Animal').agg('mean')
df['meanWithCut'] = s.reindex(df.Animal).values
df
Out[130]: 
   Animal  Max_Speed  meanWithCut
0  Falcon      380.0        375.0
1  Falcon      370.0        375.0
2  Falcon       90.0        375.0
3  Parrot       24.0        100.5
4  Parrot      100.0        100.5
5  Parrot      101.0        100.5

Pu sh с одним

df['meanWithCut'] = df.query('Max_Speed>98').groupby('Animal').agg('mean').reindex(df.Animal).values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...