Pandas分组应用apply全部

4

我有一个比较复杂的情况。假设我有以下贷款数据框案例:

test_df = pd.DataFrame({'name': ['Jack','Jill','John','Jack','Jill'],
                   'date': ['2016-08-08','2016-08-08','2016-08-07','2016-08-08','2016-08-08'],
                   'amount': [1000.0,1500.0,2000.0,2000.0,3000.0],
                   'return_amount': [5000.0,2000.0,3000.0,0.0,0.0],
                   'return_date': ['2017-08-08','2017-08-08','2017-08-07','','2017-08-08']})

test_df.head()

    amount  date        name    return_amount   return_date
0   1000.0  2016-08-08  Jack    5000.0          2017-08-08
1   1500.0  2016-08-08  Jill    2000.0          2017-08-08
2   2000.0  2016-08-07  John    3000.0          2017-08-07
3   2500.0  2016-08-08  Jack    0.0
4   2500.0  2016-08-08  Jill    0.0             2017-08-08

在按名称分组(按人员分组的贷款)后,我需要执行一些操作:

1)return amount 需要按 比例 分配给 amount 的总和。

2)如果某个人的任何贷款的return date丢失,则所有的return dates都应转换为空字符串''。

我已经有一个用于分配比例回报金额的函数:

def allocate_return_amount(group):
    loan_amount = group['amount']
    return_amount = group['return_amount']
    sum_amount = loan_amount.sum()
    sum_return_amount = return_amount.sum()
    group['allocated_return_amount'] = (loan_amount/sum_amount) * sum_return_amount
    return group

我使用 grouped_test_df = grouped_test_df.apply(allocate_return_amount) 来应用它。

我正在努力完成的是第二个操作,检查是否有人的任何贷款缺少return_date,如果是,则将该人的所有return_dates更改为''。

我在pandas文档中找到了GroupBy.all,但还没有弄清楚如何使用,有经验的人可以帮忙吗?

由于这个例子可能有点难以理解,以下是我对这个例子的理想输出:

ideal_test_df.head()

    amount  date        name    return_amount   return_date
0   1000.0  2016-08-08  Jack    0.0             ''
1   1500.0  2016-08-08  Jill    666.66          2017-08-08
2   2000.0  2016-08-07  John    3000.0          2017-08-07
3   2500.0  2016-08-08  Jack    0.0             ''
4   2500.0  2016-08-08  Jill    1333.33         2017-08-08

希望这有意义,非常感谢任何愿意花时间帮助我的熊猫专家!

为什么Jack的return_amount是零?是因为缺少return_date吗? - Psidom
是的,更重要的是 return_date 变为空白。如果 return_amount 也变为零,那太好了,但我将以 return_date 作为逻辑基础。 - unpairestgood
1个回答

2

您可以通过遍历组,使用any测试条件,然后使用loc将其设置回原始数据框来完成此操作:

test_df = pd.DataFrame({'name': ['Jack','Jill','John','Jack','Jill'],
                   'date': ['2016-08-08','2016-08-08','2016-08-07','2016-08-08','2016-08-08'],
                   'amount': [1000.0,1500.0,2000.0,2000.0,3000.0],
                   'return_amount': [5000.0,2000.0,3000.0,0.0,0.0],
                   'return_date': ['2017-08-08','2017-08-08','2017-08-07','','2017-08-08']})

grouped = test_df.groupby('name')

for name, group in grouped:
    if any(group['return_date'] == ''):
        test_df.loc[group.index,'return_date'] = ''

如果你想重置return_amount,并且不介意额外的开销,只需在此行后添加以下代码:

test_df.loc[group.index, 'return_amount'] = 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接