Python 熊猫:将函数应用于不同数据帧的多列
我有一个类,它通过比较不同的值来返回一个值。课程为:Python 熊猫:将函数应用于不同数据帧的多列,python,pandas,function,apply,Python,Pandas,Function,Apply,我有一个类,它通过比较不同的值来返回一个值。课程为: class feasible: def __init__(self,old_difference, for_value, back_value, fall_back_value): self.diff=abs(for_value-back_value) for_diff=abs(for_value-fall_back_value) back_diff=abs(back_value-fal
class feasible:
def __init__(self,old_difference, for_value, back_value, fall_back_value):
self.diff=abs(for_value-back_value)
for_diff=abs(for_value-fall_back_value)
back_diff=abs(back_value-fall_back_value)
if self.diff < old_difference:
self.value=(for_value+back_value)/2
elif for_diff<back_diff:
self.value=(for_value)
else:
self.value=(back_value)
我尝试了以下方法,但由于涉及到比较,因此返回了错误(error:序列的真值不明确)
feasible_x=feasible(diff_frame.x,for_frame.x,back_frame.x,filler_frame.x)
filler_frame.x=feasible_x.value
当前,您的方法希望接收标量值,但您将数据系列(即数据帧的列)传递给该方法。因此,
if
逻辑需要检查序列的每个元素(具有许多相同类型值的结构),而不是一个值。因此,您将收到不明确真值的错误。熊猫的新来者经常面临来自通用Python的错误。Pandas/Numpy维护的对象模型与普通Python不同
解决,因为本质上是用条件逻辑计算新字段,考虑将所有系列参数绑定到一个数据帧。然后,替换在更高维对象(如数组)上运行逻辑的
if…elif…else
class feasible:
def __init__(self, old_difference, for_value, back_value, fall_back_value):
# HORIZONTAL MERGE (OUTER JOIN) ON INDEX
x_frame = (pd.concat([old_difference, for_value, back_value, fall_back_value], axis = 1)
.set_axis(['old_difference', 'for_value', 'back_value', 'fall_back_value'],
axis = 'columns', inplace = False)
)
# ASSIGN NEW CALCULATED COLUMNS
x_frame['diff'] = (x_frame['for_value'] - x_frame['back_value']).abs()
x_frame['for_diff'] = (x_frame['for_value'] - x_frame['fall_back_value']).abs()
x_frame['back_diff'] = (x_frame['back_value'] - x_frame['fall_back_value']).abs()
# ASSIGN FINAL SERIES BY NESTED CONDITIONAL LOGIC
self.value = np.where(x_frame['diff'] < x_frame['old_difference'],
(x_frame['for_value'] + x_frame['back_value'])/2,
np.where(x_frame['for_diff'] < x_frame['back_diff'],
x_frame['for_value'],
x_frame['back_value']
)
)
# IF filler_frame DOES NOT CONTAIN MOST ROWS OF ALL FOUR DFs
feasible_x = feasible(diff_frame.x,for_frame.x,back_frame.x,filler_frame.x)
filler_frame = filler_frame.join(pd.Series(feasible_x.value).rename('x_new'), how = 'left')
所有数据帧的行数是否相同?@Parfait,是的。除了值之外,所有值都是相同的。代码中的一些空格将使@Ashok=)更易于阅读
# IF filler_frame CONTAINS THE MOST ROWS (OR EQUIVALENT TO MOST) OF ALL FOUR DFs
feasible_x = feasible(diff_frame.x,for_frame.x,back_frame.x,filler_frame.x)
filler_frame['x_new'] = feasible_x.value
# IF filler_frame DOES NOT CONTAIN MOST ROWS OF ALL FOUR DFs
feasible_x = feasible(diff_frame.x,for_frame.x,back_frame.x,filler_frame.x)
filler_frame = filler_frame.join(pd.Series(feasible_x.value).rename('x_new'), how = 'left')