我有一个pandas系列和一个我想要应用于该系列的每个元素的函数。该函数也有一个额外的参数。到目前为止一切顺利:例如
python pandas: apply a function with arguments to a series. Update
如果参数在给定列表中运行时自行变化怎么办? 我不得不在我的代码中遇到这个问题而且我找到了一个简单的解决方案,但它非常具体,(甚至更糟)不使用apply方法。
这是一个玩具型号代码:
a=pd.DataFrame({'x'=[1,2]})
t=[10,20]
我想将['x']中的元素乘以t中的元素。这里函数非常简单,len(t)与len(a ['x']。index)匹配,所以我可以这样做:
a['t']=t
a['x*t']=a['x']*a['t']
但是如果函数更复杂或两个长度不匹配呢?
我想要的是命令行,如:
a['x'].apply(lambda x,y: x*y, arg=t)
关键是这条特定的行以错误退出,因为在这种情况下arg变量只接受len = 1的元组。我没有看到任何'地方'来放置t的各种元素。
答案 0 :(得分:4)
你正在寻找的东西类似于R所谓的“回收”,其中对不等长度的数组的操作遍历较小的数组一遍又一遍,以匹配较长数组的长度。
我不知道有任何简单的内置方式来处理numpy或pandas。您可以做的是使用np.tile
重复较小的数组。类似的东西:
a.x*np.tile(t, len(a)/len(t))
只有较长的数组长度是较短数组的简单倍数时才会起作用。
您想要的行为有点不寻常。根据您正在做的事情,可能有更好的方法来处理它。只依靠重复,依靠值以所需的方式匹配是有点脆弱的。如果你有某种方法来匹配你想要乘以的每个数组中的值,你可以使用Series的.map
方法选择正确的“其他值”来乘以你的系列的每个元素。