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
3 Réponses :
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 >
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/…
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})
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
Sry néglige la question