【发布时间】:2019-01-09 17:24:08
【问题描述】:
我一直在玩这个,但我什至无法让最简单的案例工作,所以我要寻求帮助。
我有一个大数据框,我正在尝试向其中添加四个新列。根据下面的 if 语句,每列的值取决于行中的数据。
这是我目前所画的草图:
import pandas as pd
d = {'Signal': [0,1,1,0],
'Win': [False,True,False,False],
'Odds': [1.1, 1.2, 1.3, 1.4],
'Helper': [True,False,False,False],
'before': ['','','',''],
'stake':['','','',''],
'result':['','','',''],
'after':['','','','']
}
df = pd.DataFrame(d)
def function(df, start, stake_size):
'''
takes in three arguments: a dataframe, a start number as int and
stake_size as int
the function fills up before, stake, result, after columns row by row
using the IF statements below
'''
#if df['Helper']:
# df['before'] = start
#else:
# df['before'] = df['after'].shift(1)
df['before'] = start #This is so I can replicate the example
if df['Signal'] == 0:
df['stake'] = 0
df['result'] = 0
elif df['Signal'] == 1:
df['stake'] = df['before'] * (stake_size/100)
if (df['Signal'] == 1 & df['Win'] == True):
df['result'] = (df['stake'] * df['odds']) - df['stake']
else:
df['result'] = df['stake'] * -1
df['after'] = df['before'] + df['result']
return df
df.apply(function, args=(100,5), axis=1)
我只想说,这对我没有任何帮助。
我习惯于使用.apply(function, axis=1) 创建列,但在这种情况下这不起作用,因为为了之前计算,我需要在同一行中计算之后。 IE。每一行都需要按顺序填充。这就是为什么我试图将其作为一个函数来处理,该函数接受行并计算四个新列的值。
如果有任何帮助或类似示例,我将不胜感激。谢谢。
编辑:我接受了 HakunaMaData 的建议并将 Helper 列添加到 df 以确保我按预期应用第一个 if 语句。我最初以为.shift 会在这里工作,但它不会因为我不能在连续应用时移动整个数据框,对吧?
还有其他方法可以解决这个问题吗?
我正在寻找的预期输出是:
answer = {'Signal': [0,1,1,0],
'Win': [False,True,False,False],
'Odds': [1.1, 1.2, 1.3, 1.4],
'Helper': [True,False,False,False],
'before': [100,100,101,94.95],
'stake':[0,5,5,0],
'result':[0,1,-5,0],
'after':[100,101,95.95,95.95]
}
【问题讨论】:
-
模组可以更改这篇文章的标题吗?当我第一次发布这个时我很困惑,现在它没有意义。需要更像:使用 .apply 填充熊猫数据框中的新列时跟踪和使用前一行的值