python
1df = pd.DataFrame({"ID":[0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 8], 2 "drug":['A', 'B', 'C', 'C', 'B', 'D', 'D', 'E', 'D', 'C', 'D', 'E', 'D', 'E', 'C', 'B', 'A', 'F', 'B', 'B'], 3 "begin":['2018-12-26', '2019-01-25', '2014-09-02', '2014-12-02', '2014-12-23', '2014-01-10', '2016-01-25', '2015-12-18', '2014-01-27', '2015-01-15', '2015-02-04', '2016-04-26', '2014-02-06', '2014-10-07', '2016-08-19', '2016-08-23', '2014-01-01', '2014-01-27', '2014-02-07', '2014-08-27'], 4 "end":['2019-01-23', '2019-02-07', '2014-09-15', '2015-01-08', '2015-02-05', '2015-12-27', '2020-04-06', '2016-01-24', '2020-02-17', '2015-02-03', '2016-04-25', '2020-03-31', '2014-10-06', '2016-08-22', '2016-08-29', '2017-03-21', '2017-09-19', '2014-02-07', '2014-04-08', '2014-09-08'] 5 }) 6df["begin"] = pd.to_datetime(df["begin"]) 7df["end"] = pd.to_datetime(df["end"]) 8df["administer_period"] = (df["end"]+datetime.timedelta(days=1) - df["begin"]) 9df 10# 上から5行をpick up 11 ID drug begin end administer_period 120 0 A 2018-12-26 2019-01-23 29 days 131 0 B 2019-01-25 2019-02-07 14 days 142 1 C 2014-09-02 2014-09-15 14 days 153 1 C 2014-12-02 2015-01-08 38 days 164 1 B 2014-12-23 2015-02-05 45 days
上の様に個人番号("ID"), 使用した薬("drug")、薬の開始日("begin")、薬の終了日("end")、がdataframezで与えられてます。administer_periodはend+1days-begin,で導出しています。
例えば、ID1の人をみてみると、drugCとdrugBの使用期間が 20141223-20150108 でかぶってます。
**
そういったdouble countを排除して、その人に結局いずれかの薬が投与された総日数を求めたいです。**
(例えばID1の人では、double countしている日数が17日あるので、(14+38+45)-17 = 80日、となります)
なんとかして上記目標を達成するcodeが書けないでしょうか?
試行錯誤してみたのですが、3つ以上の薬が重複するケースなども存在し、うまいcodeが思いつきません。
(ID5のケースなど)
複雑になるかと思いますが、分かります方がいらっしゃいましたら、ご教授頂けますと幸いです。
よろしくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/01 11:23