我有一个每个案例的赋值数据集。我正在尝试用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']