#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
тот, который работает очень медленно и которого, как считается, лучше избегать.