首页 > 解决方案 > 比较给定列 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']

这需要很多时间!,有没有办法更快更好地做到这一点?

标签: pythonpandas

解决方案


国际大学联合会,

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

推荐阅读