Длина последовательности в датафрейме в python - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть датафрейм в python, который имеет столбец, как показано ниже:

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.

Ответы [ 5 ]

0 голосов
/ 27 февраля 2019

В 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 
0 голосов
/ 27 февраля 2019

Использование 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
0 голосов
/ 27 февраля 2019

Странный (и не рекомендуемый) способ сделать это - использовать встроенную функцию ord() для получения кодовой точки Unicode символа.

То есть:

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

Гораздо лучший способ сделать это - изменить тип строк на категории:

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

Возможно, вам придется увеличивать коды, если вы хотите разные числа.

0 голосов
/ 27 февраля 2019

Изменить для обновленного вопроса

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
0 голосов
/ 27 февраля 2019

Может быть не лучшим способом, но попробуйте это:

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

Аналогично, для B:

df.loc[df['Type'] == B, 'Seq'] = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...