第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Pandas 將函數(shù)應(yīng)用于列

Pandas 將函數(shù)應(yīng)用于列

海綿寶寶撒 2023-06-27 17:32:16
我在將多個(gè)函數(shù)應(yīng)用于我的數(shù)據(jù)框時(shí)遇到一些問題。我創(chuàng)建了一個(gè)示例代碼來說明我正在嘗試做什么。可能有比我正在做的方式更好的方法來完成這個(gè)特定的功能,但我試圖為我的問題找到一個(gè)通用的解決方案,因?yàn)槲沂褂昧硕鄠€(gè)函數(shù),而不僅僅是如何最有效地完成這個(gè)特定的事情。基本上,我有一個(gè)如下所示的示例數(shù)據(jù)框(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和一個(gè)如下所示的示例數(shù)據(jù)框(df2):  Ticker      Date  Price  SumVol0   AAPL  20200508    1.2       01   TSLA  20200508    2.2       0df2 中“SumVol”列中的值應(yīng)填充 df1 中“Volume”列中值的總和,直到第一次在 df2 中看到“Price”(df1) 列中的值為止,并且df1 中的日期與 df2 中的日期匹配期望的輸出:    Ticker      Date  Price  SumVol0   AAPL  20200508    1.2    3001   TSLA  20200508    2.2    500由于某種原因,我無法獲得此輸出,因?yàn)槲铱赡茉趪L試將該函數(shù)應(yīng)用于數(shù)據(jù)幀的代碼行中做錯(cuò)了什么。我希望這里有人可以幫助我。完整的示例代碼,包括示例數(shù)據(jù)幀: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貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

失敗的第一個(gè)原因是你的函數(shù)以 return df11.Volume.sum(不帶括號(hào))結(jié)尾,因此你只返回sum函數(shù),而不是其執(zhí)行結(jié)果。

另一個(gè)原因是您可以將函數(shù)應(yīng)用于 Dataframe 的每一行,但必須傳遞axis=1參數(shù)。但是之后:

  • 要應(yīng)用的函數(shù)應(yīng)該有一個(gè)參數(shù) - 當(dāng)前行,

  • 其結(jié)果可以替換到所需的列下。

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

如何獲得預(yù)期結(jié)果 - 方法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()

最后我生成的結(jié)果為:


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

結(jié)果是:


  Ticker      Date  Price  SumVol

0   AAPL  20200501    1.4     250

1   TSLA  20200502    2.3     530

如何獲得預(yù)期結(jié)果——方法2

但更簡潔優(yōu)雅的方法是將求和函數(shù)定義為:


def VolSum2(row):

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

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

并以同樣的方式應(yīng)用它:


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

結(jié)果當(dāng)然是一樣的。


查看完整回答
反對(duì) 回復(fù) 2023-06-27
  • 1 回答
  • 0 關(guān)注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)