Сумма, в которой соблюдаются условия, группируется по

#python #pandas #group-by

Вопрос:

Пожалуйста, как я могу добавить условие в свою группу, чтобы сказать, что если регион == Европа, выполните группировку сумм по идентификатору, дате. Я имею в виду под удостоверением личности и кошкой, мы не можем знать расстояние в Европе .

 df['distance_europe'] = df.groupby(['id', 'date'])['distance'].transform('sum')
 

данные

 df = pd.DataFrame({'id':['x2', 'x1', 'x1', 'x1'],
            'date':['2021-01-03','2021-01-02', '2021-01-01', '2021-01-01'],
       'distance':[100, 200, 200, 100],
                'status': [0, 1, 2, 3],
               'region':['USA', 'EUROPE', 'EUROPE', 'EUROPE']})
 

ожидаемый результат

 df['distance_europe'] = [0, 200, 300, 300]
 

Комментарии:

1. Пожалуйста, предоставьте образец входного кадра данных?

2. @Rishin я обновил свой оригинальный пост! можете ли вы проверить, пожалуйста. ?

3. Могу я узнать логику, с помощью которой вы получили ожидаемый результат? разве сумма не должна быть 500?

4. потому что это группа по идентификатору и дате. @Rishin, где ты видишь, что это должно быть 500?

Ответ №1:

Использовать Series.where для установки distance в 0 перед transform с sum :

 df['distance_europe'] = (df.assign(distance=df['distance'].where(df['region']=='EUROPE',0))
                           .groupby(['id', 'date'])['distance'].transform(sum))

print (df)
   id        date  distance  status  region  distance_europe
0  x2  2021-01-03       100       0     USA                0
1  x1  2021-01-02       200       1  EUROPE              200
2  x1  2021-01-01       200       2  EUROPE              300
3  x1  2021-01-01       100       3  EUROPE              300
 

Ответ №2:

попробуйте это:

 df['distance_europe'] = df.apply(lambda x: x.distance if x.region=='EUROPE' else 0, axis =1)
df['distance_europe'] = df.groupby(['id', 'date'])['distance_europe'].transform(sum)
df


    id  date       distance status  region  distance_europe
0   x2  2021-01-03  100       0      USA            0
1   x1  2021-01-02  200       1      EUROPE        200
2   x1  2021-01-01  200       2      EUROPE        300
3   x1  2021-01-01  100       3      EUROPE        300
 

Ответ №3:

Вы можете выполнить .groupby() .transform() на основе подмножества df из df.loc[df['region'] == 'EUROPE'] , а затем инициализировать df['distance_europe'] строки, не относящиеся к Европе 0 , следующим образом:

 df['distance_europe'] = df.loc[df['region'] == 'EUROPE'].groupby(['id', 'date'])['distance'].transform('sum')
df.loc[df['region'] != 'EUROPE', 'distance_europe'] = 0
 

Результат:

 print(df)

   id        date  distance  status  region  distance_europe
0  x2  2021-01-03       100       0     USA              0.0
1  x1  2021-01-02       200       1  EUROPE            200.0
2  x1  2021-01-01       200       2  EUROPE            300.0
3  x1  2021-01-01       100       3  EUROPE            300.0
 

С помощью этого кода вам не нужно использовать .apply() axis=1 тот, который работает очень медленно и которого, как считается, лучше избегать.