簡體   English   中英

Pandas:將函數應用於不同數據框的多列

[英]Pandas: apply a function to multiple columns of different data-frames

我有一個類,它通過比較不同的值來返回一個值。 班級是:

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)

如果輸入是來自不同數據幀的列,我如何應用此類並返回

所有輸入幀的格式如下:

   x         y          theta
0  0.550236 -4.621542   35.071022
1  5.429449 -0.374795   74.884065
2  4.590866 -4.628868  110.697109

我嘗試了以下操作,但由於涉及比較而返回錯誤(錯誤系列的真值不明確)。

feasible_x=feasible(diff_frame.x,for_frame.x,back_frame.x,filler_frame.x)
filler_frame.x=feasible_x.value

目前,您的方法期望接收標量值,但您將 Pandas 系列(即數據框列)傳遞到方法中。 因此, if邏輯需要檢查 Series 的每個元素(許多相同類型值的結構)而不是一個值。 因此,您會收到含糊不清的真值的錯誤。 Pandas 的新手經常面臨這個來自通用 Python 的錯誤。 Pandas/Numpy 維護與一般 Python 不同的對象模型。

要解決,因為您本質上是使用條件邏輯計算新字段,請考慮將所有系列參數綁定到一個數據框中。 然后,將if...elif...else的通用 Python 構造替換為numpy.where ,它在更高維的對象(如數組)上運行邏輯。

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']
                                      )
                              )

現在根據所有四個數據幀的行大小,必須處理不同的結果實現。 具體來說,默認情況下, axis = 1處的pd.concatjoin='outer'上運行,因此所有行都保留在水平合並操作中,並為不匹配的行填充NaN

  • 如果filler_frame (您打算添加一列的數據框)等於所有行,那么簡單的分配是可行的。

     # 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
  • 如果不是新列的左連接,則需要x_new 下面將適用於包括上述在內的所有情況。

     # 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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM