繁体   English   中英

pandas groupby 应用:返回 dataframe 与 groupby 项目作为索引

[英]pandas groupby apply: returning a dataframe with groupby items as index

考虑以下情况:

test
         date       code   value_1   value_2
0  2018-03-13  000001.SZ -0.000831  0.005560
1  2018-03-13  000002.SZ -0.004292 -0.003032
2  2018-03-13  000004.SZ  0.075862  0.057194
3  2018-03-13  000005.SZ -0.009662 -0.000146
4  2018-03-14  000001.SZ -0.008319 -0.015579
5  2018-03-14  000002.SZ  0.006773  0.002974
6  2018-03-14  000004.SZ -0.045299 -0.001154
7  2018-03-14  000005.SZ  0.002439 -0.001602
8  2018-03-15  000001.SZ -0.017617 -0.014331
9  2018-03-15  000002.SZ -0.001223  0.002258
10 2018-03-15  000004.SZ  0.016115 -0.020812
11 2018-03-15  000005.SZ -0.029197 -0.025898
12 2018-03-16  000001.SZ -0.005978  0.000145
13 2018-03-16  000002.SZ -0.000919  0.006284
14 2018-03-16  000004.SZ  0.004405  0.024784
15 2018-03-16  000005.SZ -0.005013 -0.008388

我尝试在每个组中对“value_1”和“value_2”进行排名,并返回一个新列作为它们的比率以及“code”列(“date”和“code”都是主键)

test.groupby(['date']).apply(
    lambda x: pd.concat(
        [x.code, x.value_1.rank() / x.value_2.rank()], axis=1
))                            
                    code         0
date                              
2018-03-13 0   000001.SZ  1.000000
           1   000002.SZ  2.000000
           2   000004.SZ  1.000000
           3   000005.SZ  0.500000
2018-03-14 4   000001.SZ  2.000000
           5   000002.SZ  1.000000
           6   000004.SZ  0.333333
           7   000005.SZ  1.500000
2018-03-15 8   000001.SZ  0.666667
           9   000002.SZ  0.750000
           10  000004.SZ  2.000000
           11  000005.SZ  1.000000
2018-03-16 12  000001.SZ  0.500000
           13  000002.SZ  1.000000
           14  000004.SZ  1.000000
           15  000005.SZ  2.000000

所以我们得到一个多索引 dataframe。 reset_index() 并删除列 'level_1' 产生

         date       code         0
0  2018-03-13  000001.SZ  1.000000
1  2018-03-13  000002.SZ  2.000000
2  2018-03-13  000004.SZ  1.000000
3  2018-03-13  000005.SZ  0.500000
4  2018-03-14  000001.SZ  2.000000
5  2018-03-14  000002.SZ  1.000000
6  2018-03-14  000004.SZ  0.333333
7  2018-03-14  000005.SZ  1.500000
8  2018-03-15  000001.SZ  0.666667
9  2018-03-15  000002.SZ  0.750000
10 2018-03-15  000004.SZ  2.000000
11 2018-03-15  000005.SZ  1.000000
12 2018-03-16  000001.SZ  0.500000
13 2018-03-16  000002.SZ  1.000000
14 2018-03-16  000004.SZ  1.000000
15 2018-03-16  000005.SZ  2.000000

考虑另一种方法:

def _cal_interaction(x):
    value_1 = x.value_1.rank()
    value_2 = x.value_2.rank()
    x['value'] = value_1 / value_2

    return x[['date', 'code', 'value']]


test.groupby(['date']).apply(lambda x: _cal_interaction(x))
         date       code  value
0  2018-03-13  000001.SZ    1.0
1  2018-03-13  000002.SZ    2.0
2  2018-03-13  000004.SZ    1.0
3  2018-03-13  000005.SZ    0.5
4  2018-03-14  000001.SZ    1.0
5  2018-03-14  000002.SZ    2.0
6  2018-03-14  000004.SZ    1.0
7  2018-03-14  000005.SZ    0.5
8  2018-03-15  000001.SZ    1.0
9  2018-03-15  000002.SZ    2.0
10 2018-03-15  000004.SZ    1.0
11 2018-03-15  000005.SZ    0.5
12 2018-03-16  000001.SZ    1.0
13 2018-03-16  000002.SZ    2.0
14 2018-03-16  000004.SZ    1.0
15 2018-03-16  000005.SZ    0.5

结果不同,我不知道为什么。 同样在方法一中 groupby.apply 返回一个多索引 dataframe,但在方法二中它返回一个具有原始结构的 dataframe。 我很好奇是什么导致了这些不同的返回类型。

两种方法的结果是相同的,但您可以使用droplevel来简化代码以删除组级别并仅保留原始 dataframe 的索引级别:

rank = lambda x: x.value_1.rank() / x.value_2.rank()
test['value'] = (test.groupby('date').apply(rank).droplevel(0)
print(test)

# Output
          date       code   value_1   value_2     value
0   2018-03-13  000001.SZ -0.000831  0.005560  1.000000
1   2018-03-13  000002.SZ -0.004292 -0.003032  2.000000
2   2018-03-13  000004.SZ  0.075862  0.057194  1.000000
3   2018-03-13  000005.SZ -0.009662 -0.000146  0.500000
4   2018-03-14  000001.SZ -0.008319 -0.015579  2.000000
5   2018-03-14  000002.SZ  0.006773  0.002974  1.000000
6   2018-03-14  000004.SZ -0.045299 -0.001154  0.333333
7   2018-03-14  000005.SZ  0.002439 -0.001602  1.500000
8   2018-03-15  000001.SZ -0.017617 -0.014331  0.666667
9   2018-03-15  000002.SZ -0.001223  0.002258  0.750000
10  2018-03-15  000004.SZ  0.016115 -0.020812  2.000000
11  2018-03-15  000005.SZ -0.029197 -0.025898  1.000000
12  2018-03-16  000001.SZ -0.005978  0.000145  0.500000
13  2018-03-16  000002.SZ -0.000919  0.006284  1.000000
14  2018-03-16  000004.SZ  0.004405  0.024784  1.000000
15  2018-03-16  000005.SZ -0.005013 -0.008388  2.000000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM