带有 if else 条件熊猫的数据透视表

时间:2021-06-01 14:15:03

标签: python pandas numpy machine-learning data-science

我有一张桌子:

<头>
项目 位置 类别 生命周期 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 列的逻辑相同。'

请帮我解决这个问题。

2 个答案:

答案 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

enter image description here

答案 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 你会得到:

enter image description here