DKA*_*DKA 13 python database grouping count pandas
我有一个数据框,每个人都有多个记录.我想枚举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
Run Code Online (Sandbox Code Playgroud)
这基本上和这里的问题相同,但我在python中工作,无法实现sql解决方案.我怀疑我可以使用带有可迭代计数的groupby语句,但到目前为止还没有成功.谢谢!
DKA*_*DKA 39
我偶然发现了一个令人尴尬的答案.groupby语句有一个'cumcount()'选项,它将枚举组项.
df['sequence']=df.groupby('patient').cumcount()
Run Code Online (Sandbox Code Playgroud)
需要注意的是,记录必须按照您想要枚举的顺序排列.
如果您希望根据另一列的值对序列进行排序,请首先对数据帧进行排序,然后添加新的序列列。
例如,如果我们希望根据患者就诊日期对患者就诊顺序进行排序,则可以使用以下代码。
df['sequence'] = df.sort_values(by=['patient', 'date']).groupby('patient']).cumcount() + 1
Run Code Online (Sandbox Code Playgroud)
问题是如何对多列数据进行排序。
一个简单的技巧是使用排序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
Run Code Online (Sandbox Code Playgroud)