[英]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.