我正在使用FIFA 19数据集,该数据集的“工作率”列存储了球员的进攻和防守工作率,例如(“中/中”)。我想创建另外两个列(紧邻原始列),它们可以分别存储这些功能。我们称它们为“工作率攻击”,“工作率捍卫”。我想不出最好的方法,我一直在考虑应用简单的拆分函数,但它返回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 :(“系列的真值不明确。请使用a.empty, a.bool(),a.item(),a.any()或a.all()。','发生在索引Work 评分”)
答案 0 :(得分:1)
首先,问题是此行:
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
,然后可以将其分配给所需的两列。