gpt4 book ai didi

python - Pandas :如何按符号分组并每 n 行取平均值

转载 作者:太空狗 更新时间:2023-10-30 02:26:40 34 4
gpt4 key购买 nike

假设我有以下数据框df:

        date        symbol_a  symbol_b   ratio  
0 2017/01/01 AAAA AA 10
1 2017/01/02 AAAA AA 20
2 2017/01/03 AAAA AA 30
3 2017/01/04 AAAA AA 10
4 2017/01/05 AAAA AA 10
5 2017/01/06 AAAA AA 10
6 2017/01/01 BBBB BB 10
7 2017/01/02 BBBB BB 20
8 2017/01/03 BBBB BB 30
9 2017/01/04 BBBB BB 10
10 2017/01/01 CCCC CC 10
11 2017/01/02 CCCC CC 20
12 2017/01/03 CCCC CC 30
13 2017/01/04 CCCC CC 10
14 2017/01/05 CCCC CC 10
15 2017/01/06 CCCC CC 5

我对 ratio 列的平均值感兴趣(这来自之前的数据框,该数据框有两个附加列 value_a value_b 和 ratio = value_a/value_b,或多或少)。我想做的是:

每n个元素通过symbol_a(或者_b其实是一样的)取平均值。假设 n=3。

通常我会做这样的事情:

df.groupby(['symbol_a','symbol_b']).mean()

但是,我想每 3 天获取一次子均值(实际时间跨度显然要长得多,我需要每 5 天获取一次)。

最初我以为我总是有相同数量的符号,可以被 n 整除,所以我尝试了类似的方法:

df.groupby([df.index/n, 'symbol_a', 'symbol_b']).mean().reset_index()

这非常有效,但强烈依赖于可被 n 整除的假设。不幸的是,这不仅是我想放弃的假设,而且我还注意到并非所有符号都出现了 n 次:例如请注意 symbol_a "BBBB"只出现了四次(天) .这当然会使上述尝试完全不可靠,因为它将混合不同符号的比率值。

回顾一下,我需要一些东西让我得到 ratio 列每 n 个元素的平均值,如果符号的数量不能被 n 整除,它会得到每个 n 最后是提醒的平均值(如果 number_of_symbols < n 只是该数字的平均值)。

例如,结果看起来像(假设 n=3):

      symbol_a  symbol_b   3_mean_ratio
0 AAAA AA 20
1 AAAA AA 10
2 BBBB BB 20
4 BBBB BB 10
5 CCCC CC 20
6 CCCC CC 8.33

有没有办法做这样的事情?非常感谢任何帮助,谢谢。

编辑:感谢您到目前为止的回答。最后一件理想的事情是将新的 n-days-ratio 列放在原始列旁边的简单方法。当然这个新的长度更短,但如果元素重复我不介意。基本上我需要一种方法来根据这个平均值选择“好行”。到目前为止,我正在创建一本字典作为中间步骤,但我确信有更好的方法。如果我能得到像下面这样的东西就太好了:

        date        symbol_a  symbol_b   ratio  n-days-ratio
0 2017/01/01 AAAA AA 10 20
1 2017/01/02 AAAA AA 20 20
2 2017/01/03 AAAA AA 30 20
3 2017/01/04 AAAA AA 10 10
4 2017/01/05 AAAA AA 10 10
5 2017/01/06 AAAA AA 10 10
6 2017/01/01 BBBB BB 10 20
7 2017/01/02 BBBB BB 20 20
8 2017/01/03 BBBB BB 30 20
9 2017/01/04 BBBB BB 10 10
10 2017/01/01 CCCC CC 10 20
11 2017/01/02 CCCC CC 20 20
12 2017/01/03 CCCC CC 30 20
13 2017/01/04 CCCC CC 10 8.3
14 2017/01/05 CCCC CC 10 8.3
15 2017/01/06 CCCC CC 5 8.3

最佳答案

编辑添加 n 天平均列

g = df.groupby('symbol_a').cumcount()
df['n-days-ratio'] = df.groupby(['symbol_a','symbol_b',g // 3]).transform(lambda x: x.mean())
df

输出:

          date symbol_a symbol_b  ratio  n-days-ratio
0 2017/01/01 AAAA AA 10 20.000000
1 2017/01/02 AAAA AA 20 20.000000
2 2017/01/03 AAAA AA 30 20.000000
3 2017/01/04 AAAA AA 10 10.000000
4 2017/01/05 AAAA AA 10 10.000000
5 2017/01/06 AAAA AA 10 10.000000
6 2017/01/01 BBBB BB 10 20.000000
7 2017/01/02 BBBB BB 20 20.000000
8 2017/01/03 BBBB BB 30 20.000000
9 2017/01/04 BBBB BB 10 10.000000
10 2017/01/01 CCCC CC 10 20.000000
11 2017/01/02 CCCC CC 20 20.000000
12 2017/01/03 CCCC CC 30 20.000000
13 2017/01/04 CCCC CC 10 8.333333
14 2017/01/05 CCCC CC 10 8.333333
15 2017/01/06 CCCC CC 5 8.333333

让我们使用:

g = df.groupby('symbol_a')['ratio'].transform(lambda x:x.astype(bool).cumsum().add(-1))

让我们改用 piRSquare 的 cumcount 方法。

g = df.groupby('symbol_a').cumcount()

df_out = df.groupby(['symbol_a','symbol_b',g // 3]).mean().reset_index(level=2, drop=True).reset_index()

输出:

  symbol_a symbol_b      ratio
0 AAAA AA 20.000000
1 AAAA AA 10.000000
2 BBBB BB 20.000000
3 BBBB BB 10.000000
4 CCCC CC 20.000000
5 CCCC CC 8.333333

关于python - Pandas :如何按符号分组并每 n 行取平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44125060/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com