使用Pandas与MySQL计算相邻行数据差值的方法

苏见山
苏见山
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何在Python的Pandas库和MySQL数据库中计算表格中相邻两行数据的差值(增值)。通过Pandas的diff函数可快速实现,而在MySQL中则需利用用户变量构造行号进行自连接查询。文章提供了完整的代码示例、测试数据及结果对比,帮助开发者解决此类数据清洗与计算需求。

面对这样一个数据处理需求:现有包含多列的数据表,需要新增一个名为delta的字段,该字段的值由当前行的c1列数值减去上一行的c1列数值计算得出。

针对此需求,本文提供两种实现路径:一是利用Python的Pandas库中的diff方法,二是通过SQL语句实现,具体方案如下所示。

import pandas as pd

srcTable = pd.read_csv('pos1.csv')
print(srcTable)
destTable = srcTable.loc[srcTable.tid == 1, ['ts1', 'ts2']].sort_values(by='ts1')
destTable.columns = ['deltaTs1', 'deltaTs2']
destTable = destTable.diff()
destTable = destTable.fillna(0)
destTable['delay'] = destTable['deltaTs2'] - destTable['deltaTs1']
print(destTable)

执行上述代码或查询后,得到的结果数据格式如下所示:

 tid   ts1   ts2
0 1 1500443161000 1500443161240
1 1 1500443162000 1500443162994
2 1 1500443163000 1500443163067
3 1 1500443164000 1500443164993
 deltaTs1 deltaTs2 delay
0  0.0  0.0 0.0
1 1000.0 1754.0 754.0
2 1000.0  73.0 -927.0
3 1000.0 1926.0 926.0

若选择使用SQL语句处理,以MySQL为例,由于MySQL版本差异,可能需要手动构造行号(rn)来实现相邻行数据的关联与计算。

mysql> select main.t_id,
main.ts1,
ifnull(main.ts1-sub.ts1,0) deltaTs1,
main.ts2,
ifnull(main.ts2-sub.ts2,0) deltaTs2 from
(SELECT t_id,ts1,ts2,(@r1 :=@r1 + 1) rn FROM pos1,(SELECT @r1 := 0) r where t_id=1 ORDER BY ts1) main
left join 
(SELECT t_id,ts1,ts2,(@r2 :=@r2 + 1) rn FROM pos1,(SELECT @r2 := 0) r where t_id=1 ORDER BY ts1) sub 
on main.rn-1=sub.rn;
+------+---------------+----------+---------------+----------+
| t_id | ts1   | deltaTs1 | ts2   | deltaTs2 |
+------+---------------+----------+---------------+----------+
| 1 | 1500443161000 |  0 | 1500443161240 |  0 |
| 1 | 1500443162000 |  1000 | 1500443162994 |  1754 |
| 1 | 1500443163000 |  1000 | 1500443163067 |  73 |
| 1 | 1500443164000 |  1000 | 1500443164993 |  1926 |
+------+---------------+----------+---------------+----------+

以下是用于测试的具体数据内容,格式为CSV文件。

数据文件名为pos1.csv。

1,1500443161000,1500443161240
1,1500443162000,1500443162994
1,1500443163000,1500443163067
1,1500443164000,1500443164993
CREATE TABLE `pos1` (
 `t_id` int(11) DEFAULT NULL,
 `ts1` bigint(22) DEFAULT NULL,
 `ts2` bigint(22) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO pos1 VALUES (1, 1500443161000, 1500443161240);
INSERT INTO pos1 VALUES (1, 1500443162000, 1500443162994);
INSERT INTO pos1 VALUES (1, 1500443163000, 1500443163067);
INSERT INTO pos1 VALUES (1, 1500443164000, 1500443164993);

部分数据库系统可能内置了直接计算当前行与上一行差值的函数,笔者尚未深入调研所有数据库的具体实现。据印象,SQL Server中可能存在此类功能,若有了解的朋友欢迎补充告知。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表