使用python为组中的每个元素添加一个序列号



我有一个个人的数据框架,每个人都有多条记录。我想为python中的每个个体枚举序列中的记录。本质上,我想在下表中创建"序列"列:

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语句,但到目前为止还没有成功。

我偶然发现了一个简单得令人尴尬的答案。groupby语句有一个"cumcount()"选项,它将枚举组项。

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

需要注意的是,记录必须按照您希望枚举的顺序排列。

如果希望根据另一列的值对序列进行排序,请首先对数据帧进行排序,然后添加新的序列列。

例如,如果我们希望根据患者就诊日期对患者就诊顺序进行排序,可以使用以下代码。

df['sequence'] = df.sort_values(by=['patient', 'date']).groupby('patient']).cumcount() + 1

这将从1开始订购,而不是从0开始。

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

首先,您想将日期列转换为pandas日期时间(而不是字符串):

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

问题是如何对多列数据进行排序。

一个简单的技巧是对排序函数使用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

相关内容

  • 没有找到相关文章

最新更新