我有一个pandas数据框。一列有字符串变量,另一列有1&0; s和0' s。根据针对字符串列的每个值发生的1的百分位阈值,我想用1或0替换该值。
'train_data'
数据框的两列是"问题"和"客户有争议?"
问题
结算声明
付款/收款,汇款
有关信用报告的错误信息
结算声明
交易问题
贷款修改,收款,取消抵押品赎回权
贷款服务,付款,托管帐户
贷款修改,收款,取消抵押品赎回权
信用卡保护/债务保护
消费者有争议吗? 没有 没有 没有 没有 没有 没有 没有 是 否
我的代码:
b = pd.crosstab(train_data['Issue'], train_data['Consumer disputed?']).apply(lambda r: r/r.sum(), axis=1)
b['Issue_max'] = np.where(b[1]>=0.2, 1, 0)
train_data = train_data.merge(b, on='Issue', how='left')
然后删除在train_data中合并的不需要的b列
for x in [1,0, 'Issue']:
del train_data[x]
现在代码看起来非常混乱。有没有人有更简单的代码?
答案 0 :(得分:0)
您可以使用transform
来避免合并操作(以及不需要的列):
train_data['Issue_max'] = train_data.groupby('Issue')['Consumer disputed?'] \
.transform(lambda g: (g.sum() / len(g)) >= 0.2) \
.astype(int)
最后 .astype(int)
是将布尔值转换为1
或0
的简便方法。