【问题标题】:How to generate cumulative unique count at a group level in python?如何在python中的组级别生成累积唯一计数?
【发布时间】:2021-10-15 22:00:16
【问题描述】:

我在以下表格的数据框中有一些医院就诊医疗保健数据:

record_id client_id date_of_encounter hospital_id
1 MK456 2014-01-01 01J
2 JJ103 2016-04-01 02J
3 MK456 2014-02-26 01J
4 JJ103 2016-05-01 02H
5 MK456 2014-03-01 02H
6 JJ103 2016-06-06 02J

我想创建一个列hospital_count,它是每个客户在date_of_counter 访问的唯一医院的累积计数。我已经按client_id
date_of_counter 排序。结果转换将是

record_id client_id date_of_encounter hospital_id hospital_count
1 MK456 2014-01-01 01J 1
3 MK456 2014-02-26 01J 1
5 MK456 2014-03-01 02H 2
2 JJ103 2016-04-01 02J 1
4 JJ103 2016-05-01 02H 2
6 JJ103 2016-06-06 02J 2

有些人建议使用groupbycumsum() 的组合,但我不太确定如何使用?

【问题讨论】:

标签: python sorting pandas-groupby cumulative-sum cumulative-frequency


【解决方案1】:

使用GoupBy.cumcount

每位客户就诊的不同医院数量的累计计数

import pandas as pd

df = pd.DataFrame({
  'record_id': list(range(1,7)),
  'client_id':['MK', 'JJ', 'MK', 'JJ', 'MK', 'JJ'],
  'date': [20140101, 20160401,20140226,20160501,20140301,20160606],
  'hospital': ['1j', '2j', '1j', '2h', '2h', '2j']
})

df.sort_values(by=['client_id', 'date'], inplace=True)

df['hospital_count'] = df.drop_duplicates(subset=['client_id', 'hospital']
  ).groupby('client_id').cumcount() + 1

df.fillna(method='ffill', inplace=True)

print(df)
#    record_id client_id      date hospital  hospital_count
# 1          2        JJ  20160401       2j             1.0
# 3          4        JJ  20160501       2h             2.0
# 5          6        JJ  20160606       2j             2.0
# 0          1        MK  20140101       1j             1.0
# 2          3        MK  20140226       1j             1.0
# 4          5        MK  20140301       2h             2.0

解释:我们使用drop_duplicates删除同一客户到同一家医院的连续访问;然后我们可以使用groupbycumcount 简单地计算每个客户的访问量。但是,这会在被删除的行中留下NaN 值;我们使用fillna 填充这些值。

每位客户到每家医院的累计次数

import pandas as pd

df = pd.DataFrame({
  'record_id': list(range(1,7)),
  'client_id':['MK', 'JJ', 'MK', 'JJ', 'MK', 'JJ'],
  'date': [20140101, 20160401,20140226,20160501,20140301,20160606],
  'hospital': ['1j', '2j', '1j', '2h', '2h', '2j']
})

df['hospital_count'] = df.sort_values(by=['client_id', 'hospital', 'date']
  ).groupby(['client_id', 'hospital']
  ).cumcount() + 1

print(df)
#    record_id client_id      date hospital  hospital_count
# 0          1        MK  20140101       1j               1
# 1          2        JJ  20160401       2j               1
# 2          3        MK  20140226       1j               2
# 3          4        JJ  20160501       2h               1
# 4          5        MK  20140301       2h               1
# 5          6        JJ  20160606       2j               2

【讨论】:

  • 这没有提供所需的答案。查看记录 1、3、5 医院计数
  • @Mazil_tov998 噢噢噢噢,我误解了这个问题。我计算的是每位客户访问每家医院的次数,而不是每位客户访问不同医院的次数。
  • @Mazil_tov998 这是一个新的解决方案
  • @Mazil_tov998 这次我理解正确的解决方案了吗?
  • 是的,结果正确
猜你喜欢
  • 2022-08-22
  • 2014-01-03
  • 1970-01-01
  • 2013-03-19
  • 2022-11-29
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多