Получить уникальные значения в столбце B для каждой уникальной записи в столбце A, используя python / pandas - PullRequest
0 голосов
/ 06 декабря 2018

enter image description here

Я ищу быстрый и продуктивный обходной путь для следующей задачи.

Мне нужно создать отдельный столбец для каждого DeviceID,Столбец должен содержать массив с уникальными SessionStartDate значениями для каждого DeviceID.

Например:

  • 8846620190473426378 |[2018-08-01, 2018-08-02]
  • 381156181455864495 |[2018-08-01]

Хотя пользователь 8846620190473426378 мог иметь 30 сеансов 2018-08-01 и 25 сеансов 2018-08-02, меня интересуют только уникальныедаты, когда произошли эти сеансы.

В настоящее время я использую этот подход:

df_main['active_days'] = [
sorted(
    list(
        set(
            sessions['SessionStartDate'].loc[sessions['DeviceID'] == x['DeviceID']]
            )
        )
    )  
for _, x in df_main.iterrows()
]

df_main вот еще один DataFrame, содержащий агрегированные данные, сгруппированные по DeviceID

Подход, кажется, очень (Wall time: 1h 45min 58s) медленный, и я считаю, что есть лучшее решение для этой задачи.

Заранее спасибо!

1 Ответ

0 голосов
/ 06 декабря 2018

Я считаю, что вам нужно sort_values с SeriesGroupBy.unique:

rng = pd.date_range('2017-04-03', periods=4)
sessions = pd.DataFrame({'SessionStartDate': rng, 'DeviceID':[1,2,1,2]})  
print (sessions)
  SessionStartDate  DeviceID
0       2017-04-03         1
1       2017-04-04         2
2       2017-04-05         1
3       2017-04-06         2

#if necessary convert datetimes to dates
sessions['SessionStartDate'] = sessions['SessionStartDate'].dt.date
out = (sessions.sort_values('SessionStartDate')
               .groupby('DeviceID')['SessionStartDate']
               .unique())
print (out)
DeviceID
1    [2017-04-03, 2017-04-05]
2    [2017-04-04, 2017-04-06]
Name: SessionStartDate, dtype: object

Другое решение - удалить дубликаты с помощью drop_duplicates и groupby с преобразованием в list s:

sessions['SessionStartDate'] = sessions['SessionStartDate'].dt.date
out = (sessions.sort_values('SessionStartDate')
               .drop_duplicates(['DeviceID', 'SessionStartDate'])
               .groupby('DeviceID')['SessionStartDate']
               .apply(list))
print (out)
DeviceID
1    [2017-04-03, 2017-04-05]
2    [2017-04-04, 2017-04-06]
Name: SessionStartDate, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...