我遇到了麻烦。假设我有以下示例贷款数据帧:
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
希望这是有道理的,在此先感谢所有花时间帮助我的熊猫专家!
您可以通过遍历各组,使用来测试条件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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句