Python中数据帧中的序列长度

时间:2019-02-27 19:20:32

标签: python pandas dataframe sequence

我在python中有一个数据框,其数据列如下:

Type   
 A        
 A 
 B
 B
 B

我想根据Type的顺序在数据框中添加另一列:

Type   Seq  
 A      1       
 A      2
 B      1
 B      2
 B      3

我在R中使用以下命令进行操作:

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

我不确定如何使用python。

5 个答案:

答案 0 :(得分:1)

编辑更新的问题

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

使用pd.factorize

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

输出:

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

答案 1 :(得分:1)

使用Series.rank

df['seq'] = df['Type'].rank(method = 'dense').astype(int)

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

答案 2 :(得分:1)

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 

答案 3 :(得分:0)

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

df.loc[df['Type'] == A, 'Seq'] = 1

类似地,对于B:

df.loc[df['Type'] == B, 'Seq'] = 2

答案 4 :(得分:0)

一种奇怪的方法(不推荐)是使用内置的ord()函数来获取字符的Unicode代码点。

也就是说:

df['Seq'] = df['Type'].apply(lamba x: ord(x.lower())-96)

一种更好的方法是将字符串的类型更改为类别:

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

如果您想要不同的数字,则可能必须增加代码。