使用DataFrame获取标识符矩阵

时间:2015-06-28 22:22:06

标签: 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-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')    

这给了我一个格式为

的DataFrame
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

我想创建一个DataFrame,以便使用唯一的user_id标识每一列,并且每一行都是唯一的日期。每个单元格包含一个 0或1,具体取决于user_id和日期是否在原始DataFrame中共享一行。在R

我会使用sapply和用户定义的函数进行此操作,但在Python中我很难找到解决方案。

我的user_ids数组表示为

user_names= dat2['user_id'].unique()

我的最终DataFrame应该是

形式
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

1 个答案:

答案 0 :(得分:2)

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

users = data.set_index('date')['user_id']
visits = pd.get_dummies(users)

这为我们提供了一个使用" one-hot" encoding表示用户是否在日期访问过:

            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