Python 按客户查找以前所有事件ID的最佳方法

Python 按客户查找以前所有事件ID的最佳方法,python,pandas,dataframe,Python,Pandas,Dataframe,我正在研究这个看起来相当简单的问题。数据如下所示: 例如,客户ID的当前事件ID为abc。现在,我需要以列表格式查找所有客户的所有eventId,以便记录第一个事件ID,然后记录下一个直到最新的事件ID 我对一位客户使用的方法如下: import pandas as pd import numpy as np data = pd.read_csv('test.csv') data.to_dict() {'customerid': {0: 233, 1: 250, 2: 233, 3: 250,

我正在研究这个看起来相当简单的问题。数据如下所示:

例如,客户ID的当前事件ID为abc。现在,我需要以列表格式查找所有客户的所有eventId,以便记录第一个事件ID,然后记录下一个直到最新的事件ID

我对一位客户使用的方法如下:

import pandas as pd
import numpy as np
data = pd.read_csv('test.csv')
data.to_dict()
{'customerid': {0: 233, 1: 250, 2: 233, 3: 250, 4: 233},
 'eventid': {0: 'abc', 1: 'bcd', 2: 'edc', 3: 'abl', 4: 'cdl'},
 'date': {0: '2019-12-10',
  1: '2019-12-08',
  2: '2008-12-10',
  3: '2019-12-01',
  4: '2001-12-10'},
 'previouseventid': {0: 'edc', 1: 'abl', 2: 'cdl', 3: np.nan, 4: np.nan}}
我觉得我的方法有点笨拙,有很多代码。我如何为所有客户有效地解决问题

更新:

我需要的输出是列表。
客户233的预期输出是一个列表['cdl'、'edc'、'abc'],客户250的预期输出是['abl'、'bcd']

组,然后换档应起作用:

# First, make sure your data is sorted from oldest to newest
df['date'] = pd.to_datetime(df['date'])
df.sort_values('date', inplace=True)

# Get previous event through groupby operation
df['prev_id'] = df.groupby('customerid')['eventid'].shift(1)
如果您想要每个客户的列表:

# create a dictionary with stored values – keys are customer id
prev_events_dict = df.groupby('customerid')['eventid'].apply(list).to_dict()
# map dict to dataframe
df['list_of_prev_id'] = df['customerid'].map(prev_events_dict)

您可以创建如下列表:

df['previouseventid'] = df['customerid'].map(df.groupby('customerid')['eventid'].apply(list)) 
输出:

   customerid eventid        date  previouseventid
0         233     abc  2019-12-10  [abc, edc, cdl]
1         250     bcd  2019-12-08       [bcd, abl]
2         233     edc  2008-12-10  [abc, edc, cdl]
3         250     abl  2019-12-01       [bcd, abl]
4         233     cdl  2001-12-10  [abc, edc, cdl]
groupby('customerid')['eventid'].apply(list)将只获取列表

df.groupby('customerid')['eventid'].apply(list)                                                                                                                                     

customerid
233    [abc, edc, cdl]
250         [bcd, abl]
Name: eventid, dtype: object
试试这个:

data.sort_values('date', ascending=True).groupby('customerid', sort=False)['eventid'].agg(list)
输出:

customerid
233    [cdl, edc, abc]
250         [abl, bcd]
Name: eventid, dtype: object

请正确格式化代码。另外,预期的输出也不清楚。我更新了代码和预期的输出。您应该使用df.sort_index()完成,以返回原始形式。不错的公式顺便说一句!谢谢你的回答。但我希望以列表格式为每个客户获取EventID列表。明白了。添加到我的答案@JdBabaGoo point@suppressionslayer–假设前面的索引有意义。太棒了。谢谢你花时间回答我的问题。我喜欢它。
data.sort_values('date', ascending=True).groupby('customerid', sort=False)['eventid'].agg(list)
customerid
233    [cdl, edc, abc]
250         [abl, bcd]
Name: eventid, dtype: object