1
votes

Longueur de séquence dans la trame de données en python

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.


0 commentaires

5 Réponses :


0
votes

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


0 commentaires

0
votes

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)


0 commentaires

1
votes

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


2 commentaires

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!




1
votes

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


0 commentaires