2015-06-28 5 views
0

Я пользователь R, который является новичком в python. У меня есть некоторые данныеИспользование DataFrame для получения матрицы идентификаторов

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 

ответ

2

Вы можете использовать функцию 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 
Смежные вопросы