#python #pandas
#python #pandas
Вопрос:
Я ставлю перед собой задачу решить проблему обработки данных SQL с использованием Pandas. Ниже приведены фреймы данных Pandas;
friend_request = pd.DataFrame({'sender_id':[1,1,1,2,3],
'send_to_id':[2,3,4,3,4],
'request_date':['2016_06-01','2016_06-01','2016_06-01','2016_06-02','2016_06-09']})
request_accepted = pd.DataFrame({'requester_id':[1,1,2,3,3],
'accepter_id':[2,3,3,4,4],
'accept_date':['2016_06-03','2016_06-08','2016_06-08','2016_06-09','2016_06-10']})
Вы бы преобразовали ‘request_date’ и ‘accept_date’ в переменные Pandas datetime.
friend_request['request_date']=friend_request['request_date'].replace(to_replace='_',value = '-',regex=True)
request_accepted['accept_date']=request_accepted['accept_date'].replace(to_replace='_',value = '-',regex=True)
Таким образом, у вас есть фреймы данных pandas с соответствующими dtypes. Теперь, как бы вы поступили, чтобы получить общую скорость принятия запросов, округленную до 2 десятичных знаков, что является числом принятия, разделенным на количество запросов?
Используя синтаксис SQL,
SELECT
ROUND(
ifnull(
(SELECT COUNT(*)
FROM (SELECT DISTINCT requester_id,accepter_id
FROM request_accepted) as numerator)/
(SELECT COUNT(*)
FROM (SELECT DISTINCT sender_id,send_to_id
FROM friend_request) as denominator),0),2
) AS acceptance_rate
Это просмотр всех уникальных пар (requester_id,accepter_id) и сравнение их с (sender_id, send_to_id).
Теперь, будет ли аналогичный способ решить эту проблему с использованием Pandas?
Ожидаемый результат равен 0,80
Ответ №1:
Вы можете использовать:
numerator = len(request_accepted.groupby(['requester_id', 'accepter_id']))
denominator = len(friend_request.groupby(['sender_id', 'send_to_id']))
print('{:.2f}'.format(round(numerator/denominator, 2)) if numerator/denominator else 0)
0.80