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