使用以下資料,我想我想要一列 ( ) 來計算連續真理DESIRED_DURATION_COL的持續時間(根據):start_datetime
| 專案編號 | 開始日期時間 | diag_local_code | DESIRED_DURATION_COL |
|---|---|---|---|
| 1 | 2017-01-18 | 錯誤的 | 0 |
| 1 | 2019-04-14 | 真的 | 0 |
| 1 | 2019-04-17 | 真的 | 3 |
| 1 | 2019-04-19 | 錯誤的 | 0 |
| 1 | 2019-04-23 | 真的 | 0 |
| 1 | 2019-04-25 | 真的 | 2 |
| 1 | 2019-04-30 | 真的 | 7 |
| 1 | 2019-05-21 | 錯誤的 | 0 |
這樣我就可以獲得平均真實持續時間(平均值) per project_id,這樣我就可以得到一個像這樣的 df :
| 專案編號 | avg_duration |
|---|---|
| 1 | 5 |
| 2 | 8 |
| 3 | 2 |
無法弄清楚如何做到這一點,在此先感謝!
uj5u.com熱心網友回復:
計算解決方案duration:
m = df['diag_local_code']
dt = df[m].groupby(['project_id', (~m).cumsum()])['start_datetime'].transform('first')
df['duration'] = df['start_datetime'].sub(dt).dt.days.fillna(0)
這是如何作業的?
使用cumsumon reversediag_local_code來識別每組連續的組project_id,然后過濾行,diag_local_code然后True將過濾后的資料幀分組并轉換start_datetime為first在每個組中廣播第一個日期值,最后從中減去廣播的日期值start_datetime以計算所需的持續時間
結果
project_id start_datetime diag_local_code duration
0 1 2017-01-18 False 0.0
1 1 2019-04-14 True 0.0
2 1 2019-04-17 True 3.0
3 1 2019-04-19 False 0.0
4 1 2019-04-23 True 0.0
5 1 2019-04-25 True 2.0
6 1 2019-04-30 True 7.0
7 1 2019-05-21 False 0.0
計算值的平均連續持續時間的解決True方案
m = df['diag_local_code']
(
df[m].groupby(['project_id', (~m).cumsum()])['start_datetime']
.agg(np.ptp).dt.days.groupby(level=0).mean().reset_index(name='avg_duration')
)
結果:
project_id avg_duration
0 1 5.0
uj5u.com熱心網友回復:
您可以按project_id列分組并將每個組拆分為連續的值組。然后檢查組值是 all True。
def avg_duration(group):
subgroup = group.groupby(group['diag_local_code'].diff().ne(0).cumsum())
true_count = subgroup.apply(lambda g: g['diag_local_code'].all()).sum()
true_last_sum = subgroup.apply(lambda g: g.iloc[-1]['DESIRED_DURATION_COL'] if g['diag_local_code'].all() else 0).sum()
return true_last_sum/true_count
out = df.groupby('project_id').apply(avg_duration).to_frame('avg_duration').reset_index()
print(out)
project_id avg_duration
0 1 5.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/459838.html
上一篇:從帶有漂亮湯的標簽中獲取屬性
