python - 比较给定列 2×2 值的最佳方法
问题描述
我正在尝试将我的数据框的给定列的值两两比较(以前的 VS 当前)以创建一个新列。
我的输入 df 如下:
timestamp charging
0 2017-10-15 18:36:46 1
1 2017-10-15 18:41:54 1
2 2017-10-15 18:46:54 1
3 2017-10-15 18:50:35 1
4 2017-10-15 18:54:14 -1
5 2017-10-15 18:57:54 -1
6 2017-10-15 19:02:47 -1
7 2017-10-15 19:11:41 1
8 2017-10-15 19:21:25 1
9 2017-10-15 19:31:04 -1
只有当收费值从正变为负或从负变为正时,我才想创建具有相同时间戳值的新列。输出应该是:
timestamp charging period start/end time
0 2017-10-15 18:36:46 1 NaT
1 2017-10-15 18:41:54 1 NaT
2 2017-10-15 18:46:54 1 NaT
3 2017-10-15 18:50:35 1 2017-10-15 18:50:35
4 2017-10-15 18:54:14 -1 2017-10-15 18:54:14
5 2017-10-15 18:57:54 -1 NaT
6 2017-10-15 19:02:47 -1 2017-10-15 19:02:47
7 2017-10-15 19:11:41 1 2017-10-15 19:11:41
8 2017-10-15 19:21:25 1 2017-10-15 19:21:25
9 2017-10-15 19:31:04 -1 2017-10-15 19:31:04
我使用以下代码以一种糟糕的方式(但有效)做到了这一点:
df['period start/end time'] = pd.NaT
for ind in df.index:
if ind > 0:
if df.at[ind, 'charging'] > 0 and df.at[ind-1, 'charging'] < 0:
df.at[ind-1, 'period start/end time'] = df.at[ind-1, 'timestamp']
df.at[ind, 'period start/end time'] = df.at[ind, 'timestamp']
if df.at[ind, 'charging'] < 0 and df.at[ind-1, 'charging'] > 0:
df.at[ind-1, 'period start/end time'] = df.at[ind-1, 'timestamp']
df.at[ind, 'period start/end time'] = df.at[ind, 'timestamp']
这需要很多时间!,有没有办法更快更好地做到这一点?
解决方案
国际大学联合会,
mask = (df.charging != df.charging.shift().bfill())
df.loc[mask | mask.shift(-1).fillna(False), 'new'] = df.timestamp
timestamp charging new
0 2017-10-15 18:36:46 1 NaT
1 2017-10-15 18:41:54 1 NaT
2 2017-10-15 18:46:54 1 NaT
3 2017-10-15 18:50:35 1 2017-10-15 18:50:35
4 2017-10-15 18:54:14 -1 2017-10-15 18:54:14
5 2017-10-15 18:57:54 -1 NaT
6 2017-10-15 19:02:47 -1 2017-10-15 19:02:47
7 2017-10-15 19:11:41 1 2017-10-15 19:11:41
8 2017-10-15 19:21:25 1 2017-10-15 19:21:25
9 2017-10-15 19:31:04 -1 2017-10-15 19:31:04
推荐阅读
- c# - 将 SQL FROM 子句的结尾与正则表达式匹配
- python - Numpy genfromtxt 删除下划线
- python - Celery 的 app.control.broadcast 期望什么“命令”?
- reactjs - 关于 React Router 的授权
- sql - 使用 max 函数获取状态值
- google-bigquery - 在数据融合和 BigQuery 中实施 SCD2 逻辑
- python - 如何修复“Pyside2”中模糊的 qpixmap
- git - 用于协作的子模块或子树
- regex - Nginx 使用映射和正则表达式从访问日志中排除 URL 以捕获 URL 中的部分单词
- javascript - 如何引用 WinDbg 中不同脚本中定义的 JavaScript 函数?