问题描述
从具有['race_number','number_of_horses_bet_on','odds']
列的CSV文件开始
我想添加/计算一个称为'desired_output'
的额外列。
'desired_output'
列的计算依据
- 对于'race_number'1,'number_of_horses_bet_on'= 2,因此在
'desired_output column'
中仅包括前2个'odds'
。'race_number'
1的剩余值为0。然后我们转到'race_number'
2,重复该循环。
我尝试过的代码包括:
import pandas as pd
df=pd.read_csv('test.csv')
desired_output=[]
count=0
for i in df.number_of_horses_bet_on:
for j in df.odds:
if count<i:
desired_output.append(j)
count+=1
else:
desired_output.append(0)
print(desired_output)
还有
df['desired_output']=df.odds.apply(lambda x: x if count<number_of_horses_bet_on else 0)
这些都不提供列'desired_output'的输出
我意识到上面的lambda中的“计数”放错了位置-但希望您能明白我的追求。 谢谢。
解决方法
我将做一些不同的事情,这将是我要做的
- 获取所有
race_number
的列表 - 对于每个
race_number
,提取number_of_horses_bet_on
- 创建一个包含1或0的列表,其中
number_of_horses_bet_on
的个数为1,其余为零。 - 将此列表乘以
odds
列
import pandas as pd
df=pd.read_csv('test.csv')
mask = []
races = df['race_number'].unique().tolist() # unique list of all races
for race in races:
# filter the dataframe by the race number
df_race = df[df['race_number'] == race]
# assuming number of horses is unique for every race,we extract it here
number_of_horses = df_race['number_of_horses_bet_on'].iloc[0]
# this mask will contain a list of 1s and 0s,for example for race 1 it'll be [1,1,0]
mask = mask + [1] * number_of_horses + [0] * (len(df_race) - number_of_horses)
df['mask'] = mask
df['desired_output'] = df['mask'] * df['odds']
del df['mask']
print(df)
这假定每个种族的numbers_of_horses_bet_on等于或小于该种族的行数,否则您可能需要使用最小值/最大值才能获得正确的结果