Добавить порядковый номер для каждого элемента в группе, используя python

У меня есть dataframe людей, у каждого из которых есть несколько записей. Я хочу перечислить запись в последовательности для каждого человека в python. По существу, я хотел бы создать столбец «sequence» в следующей таблице:

patient date sequence 145 20Jun2009 1 145 24Jun2009 2 145 15Jul2009 3 582 09Feb2008 1 582 21Feb2008 2 987 14Mar2010 1 987 02May2010 2 987 12May2010 3 

Это по существу тот же вопрос, что и здесь , но я работаю на python и не могу реализовать решение sql. Я подозреваю, что могу использовать оператор groupby с итерируемым счетом, но до сих пор не увенчался успехом. Благодаря!

3 Solutions collect form web for “Добавить порядковый номер для каждого элемента в группе, используя python”

Вопрос в том, как сортировать по нескольким столбцам данных.

Один простой трюк – использовать параметр key для сортированной функции.

Вы будете сортировать по строке, построенной из столбцов массива.

 rows = ...# your source data def date_to_sortable_string(date): # use datetime package to convert string to sortable date. pass # Assume x[0] === patient_id and x[1] === encounter date # Sort by patient_id and date rows_sorted = sorted(rows, key=lambda x: "%0.5d-%s" % (x[0], date_to_sortable_string(x[1]))) for row in rows_sorted: print row 

Я наткнулся на ответ, который был неловко прост. У оператора groupby есть опция cumcount (), которая будет перечислять элементы группы.

 df['sequence']=df.groupby('patient').cumcount() 

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

Во-первых, вы хотите преобразовать столбец даты в pandas datetime (а не в строки):

 In [11]: pd.to_datetime(df['date'], format='%d%b%Y') Out[11]: 0 2009-06-20 1 2009-06-24 2 2009-07-15 3 2008-02-09 4 2008-02-21 5 2010-03-14 6 2010-05-02 7 2010-05-12 Name: date, dtype: datetime64[ns] 

Примечание: см. Документы для возможных параметров формата.

 In [12]: df['date'] = pd.to_datetime(df['date'], format='%d%b%Y') In [13]: df Out[13]: patient date sequence 0 145 2009-06-20 1 1 145 2009-06-24 2 2 145 2009-07-15 3 3 582 2008-02-09 1 4 582 2008-02-21 2 5 987 2010-03-14 1 6 987 2010-05-02 2 7 987 2010-05-12 3 

Если это не в порядке даты (для каждого пациента), я бы сортировал его первым:

 In [14]: df = df.sort('date') 

Теперь вы можете группировать и копировать:

 In [15]: g = df.groupby('patient') In [16]: g.cumcount() + 1 Out[16]: 2 1 3 2 0 1 1 2 4 1 5 2 6 3 dtype: int64 

Это то, что вы хотите (несмотря на то, что он не в порядке):

 In [17]: df['sequence'] = g.cumcount() + 1 In [18]: df Out[18]: patient date sequence 2 582 2008-02-09 1 3 582 2008-02-21 2 0 145 2009-06-24 1 1 145 2009-07-15 2 4 987 2010-03-14 1 5 987 2010-05-02 2 6 987 2010-05-12 3 

Чтобы переупорядочить (хотя вам может и не понадобиться), используйте sort_index (или мы могли бы переиндексировать, если бы сохранили индекс исходного DataFrame): *

 In [19]: df.sort_index() Out[19]: patient date sequence 0 145 2009-06-24 1 1 145 2009-07-15 2 2 582 2008-02-09 1 3 582 2008-02-21 2 4 987 2010-03-14 1 5 987 2010-05-02 2 6 987 2010-05-12 3 
  • Преобразование Pandas DataFrame в JSON как элемент большей структуры данных
  • Поиск в Pandas, сопоставление одного столбца в кадре данных с другим в другой части данных
  • Сумма нескольких столбцов из кадра данных pandas
  • Подавление научной нотации в пандах?
  • Пример примера склеарна
  • Pandon pandas: сглаживание с массивами в столбце
  • python, лучший способ превратить серию pandas в рамку данных pandas
  • Pandas df в редактируемом QTableView: снимите флажки
  • Python - лучший язык программирования в мире.