用组中最后一项的值填充另一列的值



我有一个每个案例的赋值数据集。我正在尝试用case_closed日期填充每个案例的最后unassigned

case_nb   attorney      cas_closed_date assigned    last_event
1         A             2015-07-02      2015-07-02  2015-07-02
2         B             2015-09-10      2015-09-10  2015-09-10
3         C             2016-03-24      2016-03-24  2016-03-24
4         D             2018-06-07      2013-10-21  2014-02-06
4         C             2018-06-07      2013-09-13  2013-09-13
4         F             2018-06-07      2018-03-31  2018-04-05

(对于复制:

df = pd.DataFrame({'assigned': {0: pd.Timestamp('2015-07-02'), 1: '2015-09-10', 2: '2016-03-24', 3: '2013-10-21', 4: '2013-09-13', 5: '2018-03-31'},
'attorney': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'C', 5: 'F'},
'cas_closed_date': {0: pd.Timestamp('2015-07-02'), 1: '2015-09-10', 2: '2016-03-24', 3: '2018-06-07', 4: '2018-06-07', 5: '2018-06-07'},
'case_nb': {0: 1, 1: 2, 2: 3, 3: 4, 4: 4, 5: 4},
'last_event': {0: pd.Timestamp('2015-07-02'), 1: '2015-09-10', 2: '2016-03-24', 3: '2014-02-06', 4: '2013-09-13', 5: '2018-04-05'}}

(

我的数据集包括案件编号、指派的律师、案件结束日期、指派律师的日期以及律师出现的最后一个事件。对于上面的例子,我希望最后一行是

4         F             2018-06-07      2018-03-31  2018-06-07

我已经看到了几种基于同一列中的数据填写 NA 的方法,例如这个问题。但是这些方法使用transform,我无法使用多列。

到目前为止,我所拥有的适用于apply,但不是transform

def fixdate(gp):
last_unasgn = gp.iloc[-1]['last_event']
if gp.iloc[-1]['cas_closed_date'] > last_unasgn:
return gp.iloc[-1]['cas_closed_date']
else:
return last_unasgn
asmt.groupby('evt_file_number').apply(lambda x: fixdate(x))
> 4  2018-06-07

有没有办法使用transform?如果没有,使用该聚合数据填充原始数据集的最佳方法是什么?

如果同一case_nb从未在同一天分配给两个不同的律师,您可以尝试此解决方案。

import numpy as np
import pandas as pd
df = pd.DataFrame({'assigned': {0: pd.Timestamp('2015-07-02'), 1: '2015-09-10',
2: '2016-03-24', 3: '2013-10-21', 4: '2013-09-13',
5: '2018-03-31'},
'attorney': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'C', 5: 'F'},
'cas_closed_date': {0: pd.Timestamp('2015-07-02'), 1: '2015-09-10',
2: '2016-03-24', 3: '2018-06-07', 4: '2018-06-07',
5: '2018-06-07'},
'case_nb': {0: 1, 1: 2, 2: 3, 3: 4, 4: 4, 5: 4},
'last_event': {0: pd.Timestamp('2015-07-02'), 1: '2015-09-10',
2: '2016-03-24', 3: '2014-02-06', 4: '2013-09-13',
5: '2018-04-05'}})
out = df.groupby("case_nb")["assigned"].max().reset_index()
out["last"] = True
df = pd.merge(df, out, how="left", on= ["case_nb", "assigned"])
df["last_event"] = np.where(df["last"] == True, df["cas_closed_date"], df["last_event"])
del df["last"], out

可能有一个更优雅的解决方案,但至少这是矢量的(见np.where(,不要使用apply。 熊猫表演。

编辑如果您想使用transform有此选项,在我看来这是最快的解决方案。

df["last_assigned"] = df.groupby("case_nb")["assigned"].transform("max")
df["last_event"] = np.where(df["assigned"]==df["last_assigned"], 
df["cas_closed_date"],
df["last_event"])
del df["last_assigned"]

>.transform操作将每个组的所有列作为一维序列传递给函数,而.apply操作将每个组的所有列作为数据帧传递给函数。因此,.transform一次处理一个系列(或列(,.apply适用于整个数据帧(或所有列(。希望这有帮助。

我最终做了transform和普通索引的组合。

df = df.sort_values(['case_nb', 'last_event'])
df['last_unassigned'] = df.groupby('case_nb')['last_event'].transform('last')
df.loc[(df['last_event'] == df['last_unassigned'])
& (df['last_unassigned'] != df['cas_closed_date']), 'last_event'] = df['cas_closed_date']

最新更新