你能用两个不同的列作为参数创建一个python pandas函数吗?
我有一个函数,如果两列的值在同一范围内,则返回1。否则返回0:
def segmentMatch(RealTime, ResponseTime):
if RealTime <= 566 and ResponseTime <= 566:
matchVar = 1
elif 566 < RealTime <= 1132 and 566 < ResponseTime <= 1132:
matchVar = 1
elif 1132 < RealTime <= 1698 and 1132 < ResponseTime <= 1698:
matchVar = 1
else:
matchVar = 0
return matchVar
我希望第一个参数RealTime
成为数据框中的一列,这样函数将获取该列中每一行的值。例如RealTime
是df['TimeCol']
,第二个参数是df [&#39; ResponseCol&#39;]`。我希望结果成为数据框中的新列。我遇到了回答类似问题的several threads,但看起来这些参数是变量,而不是数据帧行中的值。
我尝试了以下但是它没有工作:
df['NewCol'] = df.apply(segmentMatch, args=(df['TimeCol'], df['ResponseCol']), axis=1)
答案 0 :(得分:18)
为什么不这样做?
df['NewCol'] = df.apply(lambda x: segmentMatch(x['TimeCol'], x['ResponseCol']), axis=1)
我们现在只是将每行中的相应条目作为参数传递,而不是尝试将列作为参数传递,而是将结果存储在'NewCol'
中。
答案 1 :(得分:2)
如果要在外部定义函数,则实际上并不需要lambda函数:
def segmentMatch(vec):
RealTime = vec[0]
ResponseTime = vec[1]
if RealTime <= 566 and ResponseTime <= 566:
matchVar = 1
elif 566 < RealTime <= 1132 and 566 < ResponseTime <= 1132:
matchVar = 1
elif 1132 < RealTime <= 1698 and 1132 < ResponseTime <= 1698:
matchVar = 1
else:
matchVar = 0
return matchVar
df['NewCol'] = df[['TimeCol', 'ResponseCol']].apply(segmentMatch, axis=1)
如果“ segmentMatch”改为返回2个值的向量,则可以执行以下操作:
def segmentMatch(vec):
......
return pd.Series((matchVar1, matchVar2))
df[['NewCol', 'NewCol2']] = df[['TimeCol','ResponseCol']].apply(segmentMatch, axis=1)
答案 2 :(得分:0)
执行此操作的一种chain-friendly方法是通过assign()
:
df.assign( NewCol = lambda x: segmentMatch(x['TimeCol'], x['ResponseCol']) )