我有一张桌子:
项目 | 位置 | 类别 | 生命周期 | ftecount>3 | bpsscore |
---|---|---|---|---|---|
ABC | 班加罗尔 | s | 增加 | 41 | 3.98 |
系统 | 班加罗尔 | s | 安全数据表 | 35.3 | 3.98 |
系统 | 钦奈 | 任务 | 13 | 2 | 3.98 |
每股收益 | 班加罗尔 | s | 任务 | 5 | 3.98 |
福斯 | 班加罗尔 | s | sds | 6 | 3.98 |
操作 | 诺伊达 | 任务 | 13 | 1 | 3.98 |
希望输出为:
项目 | loc_Bangalore | loc_Chennai | loc_Noida | cat_s | cat_task | ftecount>3 | bpssscore>3 |
---|---|---|---|---|---|---|---|
ABC | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
系统 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
系统 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
每股收益 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
福斯 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
操作 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
这里的条件是:
1.希望从列位置、类别的唯一值动态添加新列。
2.在新列中的值将根据以下条件: --if location = 'Banglore' 然后在新列 loc_banglore 中放入 1 else 0。
类似条件适用于所有位置唯一值和类别(在 df 中添加新列)
3.对于 ftecount 和 bpss 列,我们只需要检查条件: -- 如果 ftecount>3 那么 1 else 0
bpss 列的逻辑相同。'
请帮我解决这个问题。
答案 0 :(得分:1)
可以使用pd.get_dummies()
实现one-hot编码结果,使用lambda()
函数过滤score是否大于3。
df = pd.DataFrame({
'project': ['abc', 'Sys', 'Syst' ,'EPS', 'foss', 'opc'],
'location': ['Bangalore' ,'Bangalore', 'Chennai', 'Bangalore', 'Bangalore', 'Noida'],
'category': ['s', 's', 'task', 's', 's', 'task'],
'ftecount': [41, 35.3, 2, 5, 6, 1],
'bpssscore': [3.98, 3.98, 3.98, 3.98, 3.98, 3.98]
})
df['ftecount>3'] = df['ftecount'].apply(lambda x: 1 if x>3 else 0)
df['bpssscore>3'] = df['bpssscore'].apply(lambda x: 1 if x>3 else 0)
df = pd.concat([df['project'],
pd.get_dummies(df['location'], prefix='loc'),
pd.get_dummies(df['category'], prefix='cat'),
df['ftecount>3'],
df['bpssscore>3']
], axis=1)
输出df
答案 1 :(得分:0)
首先将类别列中的大写T替换为小写:
df['category']=df['category'].str.replace('T','t')
现在使用 pd.get_dummies()
、drop()
和 reset_index()
方法:
out=pd.get_dummies(df.set_index('project').drop(['ftecount>3','bpssscore','lifecycle'],1)).reset_index()
最后使用gt()
和astype()
方法:
out['ftecount>3']=df['ftecount>3'].gt(3).astype(int)
out['bpssscore']=df['bpssscore'].gt(3).astype(int)
现在如果你打印 out
你会得到: