亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pandas 將函數應用于列

Pandas 將函數應用于列

海綿寶寶撒 2023-06-27 17:32:16
我在將多個函數應用于我的數據框時遇到一些問題。我創建了一個示例代碼來說明我正在嘗試做什么。可能有比我正在做的方式更好的方法來完成這個特定的功能,但我試圖為我的問題找到一個通用的解決方案,因為我使用了多個函數,而不僅僅是如何最有效地完成這個特定的事情?;旧?,我有一個如下所示的示例數據框(df1):   Ticker      Date  High  Volume0    AAPL  20200501   1.5     1501    AAPL  20200501   1.2     1002    AAPL  20200501   1.3     1503    AAPL  20200502   1.4     1304    AAPL  20200502   1.2     1705    AAPL  20200502   1.1     1606    TSLA  20200501   2.5     2507    TSLA  20200501   2.2     2008    TSLA  20200501   2.3     2509    TSLA  20200502   2.4     23010   TSLA  20200502   2.2     27011   TSLA  20200502   2.1     260和一個如下所示的示例數據框(df2):  Ticker      Date  Price  SumVol0   AAPL  20200508    1.2       01   TSLA  20200508    2.2       0df2 中“SumVol”列中的值應填充 df1 中“Volume”列中值的總和,直到第一次在 df2 中看到“Price”(df1) 列中的值為止,并且df1 中的日期與 df2 中的日期匹配期望的輸出:    Ticker      Date  Price  SumVol0   AAPL  20200508    1.2    3001   TSLA  20200508    2.2    500由于某種原因,我無法獲得此輸出,因為我可能在嘗試將該函數應用于數據幀的代碼行中做錯了什么。我希望這里有人可以幫助我。完整的示例代碼,包括示例數據幀:import pandas as pddf1 = pd.DataFrame({'Ticker': ['AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'TSLA', 'TSLA', 'TSLA', 'TSLA', 'TSLA', 'TSLA'],                'Date': [20200501, 20200501, 20200501, 20200502, 20200502, 20200502, 20200501, 20200501, 20200501, 20200502, 20200502, 20200502],               'High': [1.5, 1.2, 1.3, 1.4, 1.2, 1.1, 2.5, 2.2, 2.3, 2.4, 2.2, 2.1],                'Volume': [150, 100, 150, 130, 170, 160, 250, 200, 250, 230, 270, 260]})print(df1)df2 = pd.DataFrame({'Ticker': ['AAPL', 'TSLA'],               'Date': [20200501, 20200502],                'Price': [1.4, 2.2],                'SumVol': [0,0]})print(df2)def VolSum(ticker, date, price):    df11 = pd.DataFrame(df1)    df11 = df11[df11['Ticker'] == ticker]    df11 = df11[df11['Date'] == date]    df11 = df11[df11['High'] < price]    df11 = pd.DataFrame(df11)    return df11.Volume.sumdf2['SumVol'].apply(VolSum(df2['Ticker'], df2['Date'], df2['Price']), inplace=True).reset_index(drop=True, inplace=True)print(df2)
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

失敗的第一個原因是你的函數以 return df11.Volume.sum(不帶括號)結尾,因此你只返回sum函數,而不是其執行結果。

另一個原因是您可以將函數應用于 Dataframe 的每一行,但必須傳遞axis=1參數。但是之后:

  • 要應用的函數應該有一個參數 - 當前行,

  • 其結果可以替換到所需的列下。

失敗的第三個原因是df2包含df1中不存在的日期,因此您不可能找到任何匹配的行。

如何獲得預期結果 - 方法1

首先,df2必須包含可能與df1匹配的值。我將df2定義為:

  Ticker      Date  Price  SumVol

0   AAPL  20200501    1.4       0

1   TSLA  20200502    2.3       0

然后我將你的功能更改為:


def VolSum(row):

    df11 = pd.DataFrame(df1)

    df11 = df11[df11['Ticker'] == row.Ticker]

    df11 = df11[df11['Date'] == row.Date]

    df11 = df11[df11['High'] < row.Price]

    return df11.Volume.sum()

最后我生成的結果為:


df2['SumVol'] = df2.apply(VolSum, axis=1)

結果是:


  Ticker      Date  Price  SumVol

0   AAPL  20200501    1.4     250

1   TSLA  20200502    2.3     530

如何獲得預期結果——方法2

但更簡潔優雅的方法是將求和函數定義為:


def VolSum2(row):

    return df1.query('Ticker == @row.Ticker and '

        'Date == @row.Date and High < @row.Price').Volume.sum()

并以同樣的方式應用它:


df2['SumVol'] = df2.apply(VolSum2, axis=1)

結果當然是一樣的。


查看完整回答
反對 回復 2023-06-27
  • 1 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號