python - 将结果与分组后的前一个结果进行比较
问题描述
我有一个df
这样的:
A B C D E F
2 a1 a2 a3 a4 100
2 a1 b2 c3 a4 100 # note
2 b1 b2 b3 b4 100
2 c1 c2 c3 c4 100
1 a1 a2 a3 a4 120
2 a1 b2 c3 a4 150 # note
1 b1 b2 b3 b4 130
1 c1 c2 c3 c4 110
0 a1 a2 a3 a4 80
我想比较B-E
基于列匹配的 F 列的结果,A
如下所示:
A B C D E F diff
2 a1 a2 a3 a4 100 120/100
2 a1 b2 c3 a4 100 # note 150/100
2 b1 b2 b3 b4 100 130/100
2 c1 c2 c3 c4 100 110/100
1 a1 a2 a3 a4 120 80/120
1 a1 b2 c3 a4 150 # note
1 b1 b2 b3 b4 130
1 c1 c2 c3 c4 110
0 a1 a2 a3 a4 80
由于第一行在我做的第一行中具有相同的A
值。1
120/100
我试过的:
df.groupby(['B',' 'C', 'D', 'E'])
- 这对数据进行了分组,但我不知道如何应用计算 column 先前值的逻辑A
。或者也许有一种更简单的方法来实现它。
解决方案
DataFrameGroupBy.shift
与 一起使用Series.div
:
df['d'] = df.groupby(['B', 'C', 'D', "E"])['F'].shift(-1).div(df['F'])
print (df)
A B C D E F d
0 2 a1 a2 a3 a4 100 1.200000
1 2 a1 b2 c3 a4 100 1.500000
2 2 b1 b2 b3 b4 100 1.300000
3 2 c1 c2 c3 c4 100 1.100000
4 1 a1 a2 a3 a4 120 0.666667
5 2 a1 b2 c3 a4 150 NaN
6 1 b1 b2 b3 b4 130 NaN
7 1 c1 c2 c3 c4 110 NaN
8 0 a1 a2 a3 a4 80 NaN
推荐阅读
- ruby-on-rails - 如何动态覆盖 I18n 后备
- mongodb - MongoDB collection.Watch() 编译并停止运行
- sybase - 在查询中比较两个表需要很长时间
- java - 在 Fetctype Lazy 和 Eager 上获得相同的价值
- python - 如何使用python读取xml文件?
- java - 当服务器和客户端位于不同的网络时,如何使用 AWS 在它们之间进行通信?
- python - 我不明白python中的这个max函数
- android - Firebase 云消息在后台崩溃
- php - PHP 脚本中的 PHP 环境变量
- java - 为什么 spring-data-mongodb 1.10 不支持 readConcern 选项?