python中数据帧中的序列长度

python中数据帧中的序列长度,python,pandas,dataframe,sequence,Python,Pandas,Dataframe,Sequence,我有一个python中的dataframe,其列如下所示: Type A A B B B 我想根据类型的顺序向数据框中添加另一列: Type Seq A 1 A 2 B 1 B 2 B 3 我在R中使用以下命令执行此操作: setDT(df)[ , Seq := seq_len(.N), by = rleid(Type) ] 我不知道怎么做 可能不是最好的方法,但请尝试以下

我有一个python中的dataframe,其列如下所示:

Type   
 A        
 A 
 B
 B
 B
我想根据类型的顺序向数据框中添加另一列:

Type   Seq  
 A      1       
 A      2
 B      1
 B      2
 B      3
我在R中使用以下命令执行此操作:

setDT(df)[ , Seq := seq_len(.N), by = rleid(Type) ] 

我不知道怎么做

可能不是最好的方法,但请尝试以下方法:

df.loc[df['Type'] == A, 'Seq'] = 1
同样,对于B:

df.loc[df['Type'] == B, 'Seq'] = 2
一种奇怪的(不推荐的)方法是使用内置的
ord()
函数获取字符的Unicode码点

即:

df['Seq'] = df['Type'].apply(lamba x: ord(x.lower())-96)
更好的方法是将字符串的类型更改为类别:

df['Seq'] = df['Type'].astype('category').cat.codes

如果需要不同的数字,可能需要增加代码。

编辑更新的问题

df['seq'] = df.groupby('Type').cumcount() + 1
df
输出:

  Type  seq
0    A    1
1    A    2
2    B    1
3    B    2
4    B    3
  Type  seq
0    A    1
1    A    1
2    B    2
3    B    2
4    B    2

使用
pd.factorize

import pandas as pd
df['seq'] = pd.factorize(df['Type'])[0] + 1
df
输出:

  Type  seq
0    A    1
1    A    2
2    B    1
3    B    2
4    B    3
  Type  seq
0    A    1
1    A    1
2    B    2
3    B    2
4    B    2
使用


pandas中

(df.Type!=df.Type.shift()).ne(0).cumsum()
Out[58]: 
0    1
1    1
2    2
3    2
4    2
Name: Type, dtype: int32

更多信息

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 

非常感谢。我现在编辑的问题实际上犯了一个错误。我希望序列是(1,2)和(1,2,3)。@user36729好的,回答这个问题。快乐编码!