簡體   English   中英

為什么pandas groupby 只將第一行傳遞給apply()?

[英]Why does pandas groupby pass only the first row to apply()?

我有一個 Pandas 數據框,其中包含幾個要稍后填寫的空白列以及其他列中的一些實際數據。 數據框的頂部看起來像這樣

我正在嘗試進行分組並逐行返回一個全新的數據幀,即對於每個組,我進行一些操作並返回一行,並且所有這些行都連接成一個數據幀。 這是我的操作函數的代碼:

def get_trade_text(single_trade):
    single_trade.sort_values('Expiry', ascending=False, inplace=True)
    common_denominator = np.gcd.reduce(single_trade.Quantity)
    prem_diff = single_trade['CostBasis'].sum() / 100 / common_denominator
    ticker = single_trade.Symbol.values[0]
    exp = single_trade.Expiry.values[0]

    risk = calc_max_loss(single_trade)

    trade_text = ticker + ' ' + ' / '.join(single_trade.Expiry.dt.strftime('%b-%y')) + ' ' + \
                 ' / '.join(single_trade.Strike.astype(str)) + ' ' + ' / '.join(single_trade.Type) + ' Spread @ $' + \
                 '{:.2f}'.format(abs(prem_diff)) + ' ' + ('Debit' if prem_diff > 0 else 'Credit')

    return pd.Series([trade_text, prem_diff, exp, risk, ticker])

calc_max_loss函數返回單個浮點數,因此risk是一個浮點值。

我的問題是:當我使用df.groupby('ID').apply(get_trade_text)在表上調用此函數時,我希望為每個 ID 返回一行。 但是,在運行此代碼時,我看到它返回了許多行,但所有這些行都只是ID == 1組的輸出。 所以輸出看起來像這樣 這些是我期望ID為 1 的行,但沒有顯示其他 ID。

我嘗試過的事情:

1)我重新編寫了操作函數以簡單地打印出傳遞給它的任何內容。 同樣的問題。 它只打印出與ID == 1相關的組。

2) 我使用df.groupby('ID').groups在調試器中打印出df.groupby('ID').groups ,它顯示正確,即它顯示 76 個組(每個 ID 一個),每個組在其值中都有正確的索引。

3)我嘗試更改我用來分組的列,它再次出現完全相同的問題,即如果我執行df.groupby('Symbol').apply(get_trade_text) ,它會從Symbol列創建組,對其進行排列按字母順序排列,因此AAPL是第一組,然后返回AAPL行,而不返回其他符號的行。

我不確定為什么會發生這種情況。 我在更復雜的數據幀上使用了groupby ,它通常完全按預期工作。 但是對於這個數據,它似乎出現了故障。

任何幫助表示贊賞。

問題是這一行:

single_trade.sort_values('Expiry', ascending=False, inplace=True)

您不應該以任何方式對傳遞的數據框進行編輯。 它應該像只讀操作一樣工作。 只需將其替換為:

single_trade = single_trade.sort_values('Expiry', ascending=False)

解決了這個問題。

暫無
暫無

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

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