2 votes

Une façon rapide d'appliquer la fonction pour un nombre à pandas.series

Le problème est décrit ici pour le cas spécifique, mais il serait utile pour de nombreux projets similaires.

Une série pandas.series appelée mois contiennent la date du mois de chaque échantillon dans le format suivant int (1,2,3,4,...). Je veux le transformer en "01, 02, 03, ... 12" et l'ajouter à l'année.

Utilisation "{0:0=2d}".format(a) y boucle les valeurs de la série peuvent être facilement transformées :

df['date'] = np.nan
for i in range(0,len(df),1):
    df.date.iloc[i] = df.year.iloc[i] +"-"+'%2d'%df.month.values.iloc[i]   
### df.date is a new series contain the year-month('2017-01','2017-02')

Mais la stratégie de la boucle est inefficace. Existe-t-il un moyen simple d'atteindre le même objectif ?

4voto

Scott Boston Points 48995

Vous pouvez utiliser apply :

month.apply("{0:0=2d}".format)

Calendrier

  • La méthode Psidom

%timeit month.astype(str).str.zfill(2)

10 boucles, meilleure des 3 : 39,1 ms par boucle

  • Cette méthode :

%timeit month.apply("{0:0=2d}".format)

100 boucles, meilleur des 3 : 7,93 ms par boucle

df = pd.DataFrame({'month':pd.np.random.randint(1,12,10000),'year':pd.np.random.choice([i for i in range(2004,2017)],10000)})

df.year.astype(str) + '-' + df.month.apply("{0:0=2d}".format)

Salida:

0       2014-10
1       2012-04
2       2015-03
3       2014-05
4       2007-03
5       2008-04

3voto

Psidom Points 115100

Vous pouvez convertir mois à str et utiliser ensuite str.zfill :

month = pd.Series([1,2,12])

month.astype(str).str.zfill(2)

#0    01
#1    02
#2    12
#dtype: object

Pour le concaténer avec l'année :

df.year.astype(str) + '-' + df.month.astype(str).str.zfill(2)

2voto

piRSquared Points 159

Vous pouvez utiliser pd.to_datetime sur un tableau de données dont les colonnes sont nommées de manière appropriée, afin de créer une série d'objets de type "datetime".

Considérons le cadre de données df

df = pd.DataFrame(dict(year=[2011, 2012], month=[3, 4]))
df

   month  year
0      3  2011
1      4  2012

Il ne nous manque plus que le day colonne. Si nous l'ajoutons, nous pouvons la passer à pd.to_datetime

pd.to_datetime(df.assign(day=1))

0   2011-03-01
1   2012-04-01
dtype: datetime64[ns]

C'était bien pratique. Et maintenant ?

pd.to_datetime(df.assign(day=1)).apply('{:%Y-%m}'.format)

0    2011-03
1    2012-04
dtype: object

Ou

pd.to_datetime(df.assign(day=1)).dt.strftime('%Y-%m')

0    2011-03
1    2012-04
dtype: object

Créer une nouvelle colonne

df.assign(year_month=pd.to_datetime(df.assign(day=1)).dt.strftime('%Y-%m'))

   month  year year_month
0      3  2011    2011-03
1      4  2012    2012-04

Cependant, nous aurions pu nous contenter de faire

df.assign(year_month=df.apply(lambda x: '{year}-{month:02d}'.format(**x), 1))

   month  year year_month
0      3  2011    2011-03
1      4  2012    2012-04

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X