Как сохранить дату первого использования в словаре с помощью цикла for - PullRequest
1 голос
/ 23 мая 2019

У меня есть набор данных userids и все время, когда они используют определенный проход. Мне нужно выяснить, сколько дней прошло с тех пор, как каждый из них впервые использовал пропуск. Я думал о том, чтобы пробежаться по набору данных и сохранить первое использование в словаре и минус его от сегодняшней даты. Я не могу заставить его работать.

ИД пользователя Начало использования День
1712 2019-01-04 пятница
1712 2019-01-05 суббота
9050 2019-01-04 пятница
9050 2019-01-04 пятница
9050 2019-01-06 воскресенье
9409 2019-01-05 суббота
9683 2019-05-20 Понедельник
8800 2019-05-17 пятница
8800 2019-05-17 пятница

Это часть набора данных. Формат даты: Y-m-d

usedict={}  
keys = df.user_id  
values = df.start_date  
for i in keys:  
    if (usedict[i] == keys):  
      continue   
else:  
    usedict[i] = values[i]  
prints(usedict)  

user_id use_count days_used Ave Daily Trips register_date days_since_reg
12 42 23 1,826087 NaT NaT
17 28 13 2,153846 NaT NaT
114 54 24 2.250000 2019-02-04 107 дней
169 31 17 1,823529 NaT NaT
1414 49 20 2,450000 NaT NaT
1712 76 34 2,235294 NaT NaT
2388 24 12 2.000000 NaT NaT
6150 10 5 2.000000 2019-02-05 106 дней

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Вы можете достичь того, что вы хотите, с помощью следующего.Я использовал только 2 идентификатора пользователя из приведенного вами примера, но это применимо ко всем.

import pandas as pd
import datetime

df = pd.DataFrame([{'Userid':'1712','use_date':'2019-01-04'},
                    {'Userid':'1712','use_date':'2019-01-05'},
                    {'Userid':'9050','use_date':'2019-01-04'},
                    {'Userid':'9050','use_date':'2019-01-04'},
                    {'Userid':'9050','use_date':'2019-01-06'}])

df.use_date = pd.to_datetime(df.use_date).dt.date
group_df = df.sort_values(by='use_date').groupby('Userid', as_index=False).agg({'use_date':'first'}).rename(columns={'use_date':'first_use_date'})

group_df['diff_from_today'] = datetime.datetime.today().date() - group_df.first_use_date

Вывод:

print(group_df)
  Userid first_use_date diff_from_today
0   1712     2019-01-04        139 days
1   9050     2019-01-04        139 days

Проверка sort_values и groupby для более подробной информации.

0 голосов
/ 23 мая 2019

Я смотрю только на два столбца, но вы можете найти мин для каждого идентификатора с помощью groupby, а затем использовать применить, чтобы получить разницу (я сделал разницу в днях)

import pandas as pd
import datetime

user_id = [1712, 1712, 9050, 9050, 9050, 9409, 9683, 8800, 8800]
start = ['2019-01-04', '2019-01-05', '2019-01-04', '2019-01-04', '2019-01-06', '2019-01-05', '2019-05-20', '2019-05-17', '2019-05-17']

df = pd.DataFrame(list(zip(user_id, start)), columns = ['UserId', 'Start'])
df['Start']= pd.to_datetime(df['Start']) 
df = df.groupby('UserId')['Start'].agg([pd.np.min])
now = datetime.datetime.now()
df['days'] = df['amin'].apply(lambda x: (now - x).days)
a_dict = pd.Series(df.days.values,index = df.index).to_dict()
print(a_dict)

Ссылки:

Метод to_dict () взят из @ jeff


Вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...