2
votes

Comment créer des colonnes avec des mois à partir de séries datetime?

J'ai donc ces données avec l'identifiant, la date et s'ils ont fait des activités ce jour-là

ID 2009-1 2009-2 ... 2009-9 2009-10 2009-11 2009-12
1     1     0    ...   0         0       0     1
2     0     0    ...   1         1       0     0
3     0     0    ...   0         0       0     0

Je souhaite donc regrouper et créer des colonnes avec des mois et 1 s'ils ont fait l'activité en ce mois-là 0 ow

ID             DATE              DONE  
1           2009-1-3             Yes
1           2009-1-15            Yes
2           2009-9-3             Yes
3           2009-10-7            No
1           2009-12-1            Yes
3           2009-10-8            Yes
2           2009-10-21           Yes

Merci


1 commentaires

Sry néglige la question


3 Réponses :


1
votes

En utilisant Series groupby + all puis avec unstack

s=df['DONE'].eq('Yes').\
      groupby([df['ID'],df.DATE.dt.strftime('%Y-%m')]).\
          all().astype(int).unstack(fill_value=0)
s
Out[1026]: 
DATE  2009-01  2009-09  2009-10  2009-12
ID                                      
1           1        0        0        1
2           0        1        1        0
3           0        0        0        0

p >


2 commentaires

Merci beaucoup. Sur une note sans rapport, quelles sont les meilleures ressources pour maîtriser les pandas? J'en connais les bases, mais quand il s'agit de choses complexes, j'ai du mal.


@jarge juste mon expérience personnelle, vous pouvez consulter le livre Livre de cuisine Pandas pandas .pydata.org / pandas-docs / stable / user_guide / cookbook.htm‌ l ou le livre books.google.com/books/about/…



1
votes

Encore une autre façon

Configuration

df.pivot_table(columns='DATE2', index='ID', values='DONE').reindex(np.arange(200901, 200913), axis='columns').fillna(0)


DATE2   200901  200902  200903  200904  200905  200906  200907  200908  200909  200910  200911  200912
ID                                              
1       1.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     1.0
2       0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     1.0     1.0     0.0     0.0
3       0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.5     0.0     0.0

Solution

Créez ensuite une colonne int auxiliaire dans le style 200901

df['DATE2']=df.DATE.dt.year.astype(str).add(df.DATE.dt.month.astype(str).str.zfill(2)).astype(int)

et pivot_table + reindex

df.DATE = pd.to_datetime(df.DATE)
df.DONE = df.DONE.map({'Yes':1, 'No':0})


0 commentaires

1
votes

Je sais que je suis en retard mais je pense que cette solution est également très intéressante:

df['DATE'] = pd.to_datetime(df['DATE']).dt.strftime('%Y-%m')
(df.pivot(columns='DATE', values='DONE') == 'Yes') + 0


0 commentaires