我在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。
答案 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
如果您想要不同的数字,则可能必须增加代码。