我正在寻找以下任务的快速有效的解决方法。
我需要为每个DeviceID
创建一个单独的列。该列必须包含一个数组,其中每个SessionStartDate
的值都具有唯一的DeviceID
。
例如:
尽管用户8846620190473426378
在2018-08-01可能有30个会话,在2018-08-02上有25个会话,但我只对这些会话发生的唯一日期感兴趣。
当前,我正在使用这种方法:
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
,并且我认为有更好的解决方案。
谢谢!
答案 0 :(得分:1)
我相信您需要sort_values
和SeriesGroupBy.unique
:
font
另一种解决方案是将drop_duplicates
和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
删除重复项并转换为groupby
s:
list