繁体   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