Python 使用DataFrame获取标识符矩阵

Python 使用DataFrame获取标识符矩阵,python,pandas,dataframe,Python,Pandas,Dataframe,我是一个新加入python的R用户。我有一些数据 dat1=DataFrame({'user_id':['a1','a1','a4','a3','a1','a15', 'a8', 'a15' ,'a1', 'a5'], 'Visits':[1,4,2,1,3,1,1,8,1,9],'cell': [14,21,14,14,19,10,18,17,10,11], 'date': ['2011-01-05', '2011-01-05', '2011-01-12', '2011-01-

我是一个新加入python的R用户。我有一些数据

dat1=DataFrame({'user_id':['a1','a1','a4','a3','a1','a15', 'a8', 'a15'      ,'a1', 'a5'],
 'Visits':[1,4,2,1,3,1,1,8,1,9],'cell': [14,21,14,14,19,10,18,17,10,11], 
 'date': ['2011-01-05', '2011-01-05', '2011-01-12', '2011-01-12', '2011-01-12',   '2011-01-12', '2011-01-02', '2011-01-19', '2011-01-19', '2011-01-19' ] })




 dat1['date']=pd.to_datetime(dat1['date'])

 dat2=dat1.sort_index(by='date')    
这给了我一个表单的数据框架

Visits  cell     date     user_id
   1    18   2011-01-02      a8
   1    14   2011-01-05      a1
   4    21   2011-01-05      a1
   2    14   2011-01-12      a4
   1    14   2011-01-12      a3
   3    19   2011-01-12      a1
   1    10   2011-01-12     a15
   8    17   2011-01-19     a15
   1    10   2011-01-19      a1
   9    11   2011-01-19      a5
我想创建一个数据框,这样每一列都用一个唯一的用户id标识,每一行都是一个唯一的日期。每个单元格包含一个 0或1,具体取决于用户id和日期是否在原始数据框中共享一行。在R

我会使用sapply和一个用户定义的函数来完成这个操作,但在Python中,我很难找到一个解决方案

我的用户ID数组表示为

user_names= dat2['user_id'].unique()
我的最后一个数据帧应该是

a8 a1 a4 a3 a15 a5
1  0  0  0  0  0
0  1  0  0  0  0
0  1  1  1  1  0
0  1  0  0  1  1

您可以在此处使用
get_dummies
功能:

users = data.set_index('date')['user_id']
visits = pd.get_dummies(users)
这为我们提供了一个数据帧,它使用“一个热”编码来表示用户是否在该日期访问:

            a1  a15  a3  a4  a5  a8
date                               
2011-01-02   0    0   0   0   0   1
2011-01-05   1    0   0   0   0   0
2011-01-05   1    0   0   0   0   0
2011-01-12   0    0   0   1   0   0
2011-01-12   0    0   1   0   0   0
2011-01-12   1    0   0   0   0   0
2011-01-12   0    1   0   0   0   0
2011-01-19   0    1   0   0   0   0
2011-01-19   1    0   0   0   0   0
2011-01-19   0    0   0   0   1   0
但日期是重复的。因此,我们根据日期索引和聚合进行分组,询问用户是否访问了该日期的任何条目:

visits.groupby(visits.index).any().astype(int)
其中:

            a1  a15  a3  a4  a5  a8
date                               
2011-01-02   0    0   0   0   0   1
2011-01-05   1    0   0   0   0   0
2011-01-12   1    1   1   1   0   0
2011-01-19   1    1   0   0   1   0