J'ai un dataframe en python qui a une colonne comme ci-dessous:
setDT(df)[ , Seq := seq_len(.N), by = rleid(Type) ]
Je veux ajouter une autre colonne à mon data frame selon la séquence de Type:
Type Seq A 1 A 2 B 1 B 2 B 3
Je le faisais en R avec la commande suivante:
Type A A B B B
Je ne sais pas comment le faire en python.
5 Réponses :
Ce n'est peut-être pas le meilleur moyen, mais essayez ceci:
df.loc[df['Type'] == B, 'Seq'] = 2
De même, pour B:
df.loc[df['Type'] == A, 'Seq'] = 1
Une manière étrange (et non recommandée) de le faire est d'utiliser la fonction intégrée ord ()
pour obtenir le point de code Unicode du caractère.
C'est-à-dire:
df['Seq'] = df['Type'].astype('category').cat.codes
Une bien meilleure façon de le faire est de changer le type des chaînes en catégories:
df['Seq'] = df['Type'].apply(lamba x: ord(x.lower())-96)
Modifier pour la question mise à jour
Type seq 0 A 1 1 A 1 2 B 2 3 B 2 4 B 2
Résultat:
import pandas as pd df['seq'] = pd.factorize(df['Type'])[0] + 1 df
Utilisez pd.factorize
:
Type seq 0 A 1 1 A 2 2 B 1 3 B 2 4 B 3
Sortie :
df['seq'] = df.groupby('Type').cumcount() + 1 df
Merci. J'ai fait une erreur dans ma question que j'ai éditée maintenant. Je veux que la séquence soit (1,2) et (1,2,3).
@ user36729 Très bien, répondez à cela aussi. Bon codage!
Dans pandas
v=c('A','A','B','B','B','A') data.table::rleid(v) [1] 1 1 2 2 2 3 df Type 0 A 1 A 2 B 3 B 4 B 5 A# assign a new number in R data.table rleid (df.Type!=df.Type.shift()).ne(0).cumsum() Out[60]: 0 1 1 1 2 2 3 2 4 2 5 3# check
En savoir plus
(df.Type!=df.Type.shift()).ne(0).cumsum() Out[58]: 0 1 1 1 2 2 3 2 4 2 Name: Type, dtype: int32