使用python / pandas为B列中的每个唯一记录获取B列中的唯一值

时间:2018-12-06 09:56:14

标签: python pandas jupyter-notebook

enter image description here

我正在寻找以下任务的快速有效的解决方法。

我需要为每个DeviceID创建一个单独的列。该列必须包含一个数组,其中每个SessionStartDate的值都具有唯一的DeviceID

例如:

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

尽管用户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,并且我认为有更好的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

我相信您需要sort_valuesSeriesGroupBy.unique

font

另一种解决方案是将drop_duplicatesrng = 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