基于其他列中的值创建新列

2024-04-30 04:07:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我玩的是国际足联19数据集,其中有'工作率'栏,存储攻击和;防守球员的工作率,例如('Medium/Medium)。我想创建两个额外的列(就在原来的列旁边)来分别存储这些特性;让我们称之为“工作效率攻击”,“工作效率防御”。我想不出最好的方法,我一直在考虑应用简单的split函数,但它返回ValueError

def split_work_rate(text, work_type):
    while not pd.isnull(text):
        new_text = text.split('/')
        if work_type == 'Attacking':
            work_rate_attacking = new_text[0]
            return work_rate_attacking
        else:
            work_rate_defending = new_text[1]
            return work_rate_defending


def create_new_work_rates(data):
    cols = ['Work Rate']
    data['Work Rate Attacking'] = data[cols].apply(split_work_rate, args=('Attacking',))
    data['Work Rate Defending'] = data[cols].apply(split_work_rate, args=('Defending',))
    return data

ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', 'occurred at index Work Rate')


Tags: textnewdatareturnratedefworksplit
1条回答
网友
1楼 · 发布于 2024-04-30 04:07:14

首先,问题是这条线:

if work_type == 'Attacking':

在编写时,您可能会想,pandas会将每一行中的值与'Attacking'进行比较,然后转到相应的分支

然而,事实上,pandas立即将这种比较应用于整个Series。因此,与'Attacking'比较的结果不是一个布尔值,而是另一个Series。没有无歧义的方法可以将Series个布尔值转换为单个布尔值,因此if测试不起作用

无论如何,这可能不是最好的方法。试试这个:

data[['Work Rate Attacking', 'Work Rate Defending']] = data['Work Rate'].str.split('/', expand=True)

这将使用str访问器将Series拆分为DataFrame,然后将其分配给所需的两列

相关问题 更多 >