#python #pandas
#python #pandas
Вопрос:
Спасибо, что нашли время, чтобы прочитать это. В настоящее время я изучаю, как перемещаться по библиотеке Pandas на Python, и сегодня столкнулся с небольшой проблемой.
По сути, чтобы быть кратким, у меня есть фрейм данных для нескольких разных служб подписки, который содержит следующую информацию (извинения за форматирование):
Код пользователя / Событие / Дата события / Ежемесячная цена
Итак, пара примеров строк будет примерно такой:
223 / Subscription Start / 2020-10-03 / 15.00
223 / Subscription End / 2021-12-02 / 15.00
224 / Subscription Start / 2020-10-03 / 12.00
225 / Subscription Start / 2020-10-04 / 13.00
И если нет конца подписки, то предполагается, что пользователь все еще подписан на услугу.
Мой вопрос в том, есть ли способ, используя Pandas, рассчитать общую сумму, потраченную на ежемесячные платежи для всех пользователей до определенного периода времени?
Так, например, если у нас три разных пользователя, все трое подписались на одну и ту же дату, в марте 2020 года. Один из них отменил подписку после двух циклов выставления счетов, в то время как два других все еще подписаны, и прошло пять циклов выставления счетов. Ожидаемый результат будет:
5 * (Subscription price person 1)
5 * (Subscription price person 2)
2 * (Subscription price person 3)
=
Total amount.
Я хочу знать, есть ли способ получения этой информации в Pandas.
Огромное спасибо, что дочитали до этого!
Ответ №1:
Предположим, у вас есть этот фрейм данных:
User code Event Event Date Monthly price
0 223 Subscription Start 2020-10-03 15.0
1 223 Subscription End 2021-12-02 15.0
2 224 Subscription Start 2020-10-03 12.0
3 225 Subscription Start 2020-10-04 13.0
Затем вы можете повернуть таблицу:
df = (
df.pivot(
index=["User code", "Monthly price"],
columns="Event",
values="Event Date",
)
.fillna(pd.Timestamp.now())
.reset_index()
)
print(df)
Это выводит:
Event User code Monthly price Subscription End Subscription Start
0 223 15.0 2021-12-02 00:00:00.000000 2020-10-03
1 224 12.0 2021-04-14 00:20:28.427278 2020-10-03
2 225 13.0 2021-04-14 00:20:28.427278 2020-10-04
Затем, чтобы вычислить плату, просто сделайте разницу между Subscription Start
Subscription End
столбцами и и умножьте на Monthly price
:
df["Total amount"] = (
df["Subscription End"].dt.to_period("M")
- df["Subscription Start"].dt.to_period("M")
).apply(lambda x: x.n) * df["Monthly price"]
print(df)
С принтами:
Event User code Monthly price Subscription End Subscription Start Total amount
0 223 15.0 2021-12-02 00:00:00.000000 2020-10-03 210.0
1 224 12.0 2021-04-14 00:22:48.941899 2020-10-03 72.0
2 225 13.0 2021-04-14 00:22:48.941899 2020-10-04 78.0
Комментарии:
1. @Arthur Попробуйте преобразовать столбец даты события в DateTime перед запуском кода:
df['Event Date'] = pd.to_datetime(df['Event Date'])
2. Огромное спасибо за потраченное время, Андрей. Последний вопрос, есть ли способ заменить . нужно ли использовать определенную дату вместо текущего времени?
3. @Arthur Да, вы можете использовать, например
pd.Timestamp("2020-10-23")
(измените строку даты по своему усмотрению)