【问题标题】:New list based on 3 other lists基于其他 3 个列表的新列表
【发布时间】:2020-11-30 11:56:02
【问题描述】:

从包含 ['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 中的“计数”放错了位置 - 但希望你能看到我所追求的。 谢谢。

【问题讨论】:

  • 请显示您的代码生成的结果
  • 下次尝试将使用的数据集提供为文本而不是图片

标签: python pandas list dataframe lambda


【解决方案1】:

我会做一些不同的事情,这就是我要做的事情

  • 获取所有race_number的列表
  • 对于每个race_number,提取number_of_horses_bet_on
  • 创建一个包含 1 或 0 的列表,其中 number_of_horses_bet_on 的个数为 1,其余为 0。
  • 将此列表与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,0,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 等于或小于该比赛的行数,否则您可能需要使用 min/max 来获得正确的结果

【讨论】:

  • 感谢 Jimmar - 100% 有效。试图理解这一行: mask = mask + [1] * number_of_horses + [0] * (len(df_race) - number_of_horses) ...... [1] 和 [0] 指的是列表中的索引位置- 对吗?
  • 哦,在 python 中,如果你这样做,例如[2] * 3,你会得到 [2,2,2]
  • 不客气,如果这回答了您的问题,请考虑将其标记为正确答案
猜你喜欢
  • 2011-11-10
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2012-08-10
相关资源
最近更新 更多