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