熊猫:基于特定的列值重置累加

问题描述 投票:1回答:1

我想创建由1的每一行是并没有NAT在差异列表增加了一列。如果该值是NAT,我想要的增量重置

下面是一个例子数据框:

              x        y      min      z        o     diffs
0             0        0       0       1        1      NaT
1             0        0       0       2        1 00:00:01
2             0        0       0       6        1 00:00:04
3             0        0       0      11        1 00:00:05
4             0        0       0      14        0      NaT
5             0        0       2      18        0      NaT
6             0        0       2      41        1      NaT
7             0        0       2      42        0      NaT
8             0        0       8      13        1 00:00:54
9             0        0       8      16        1 00:00:03
10            0        0       8      17        1 00:00:01
11            0        0       8      20        0      NaT
12            0        0       8      32        1      NaT

这是我期望的输出:

              x        y      min      z        o     diffs   increment
0             0        0       0       1        1      NaT      0
1             0        0       0       2        1 00:00:01      1
2             0        0       0       6        1 00:00:04      2
3             0        0       0      11        1 00:00:05      3
4             0        0       0      14        0      NaT      0
5             0        0       2      18        0      NaT      0
6             0        0       2      41        1      NaT      0
7             0        0       2      42        0      NaT      0
8             0        0       8      13        1 00:00:54      1
9             0        0       8      16        1 00:00:03      2
10            0        0       8      17        1 00:00:01      3
11            0        0       8      20        0      NaT      0
12            0        0       8      32        1      NaT      0

python pandas
1个回答
2
投票

使用numpy.where用一套不遗漏值用连续的非缺失组cumcount反击:

m = df['diffs'].notnull()
df['increment'] = np.where(m, df.groupby(m.ne(m.shift()).cumsum()).cumcount()+1, 0)
print (df)
    x  y  min   z  o    diffs  increment
0   0  0    0   1  1      NaT          0
1   0  0    0   2  1 00:00:01          1
2   0  0    0   6  1 00:00:04          2
3   0  0    0  11  1 00:00:05          3
4   0  0    0  14  0      NaT          0
5   0  0    2  18  0      NaT          0
6   0  0    2  41  1      NaT          0
7   0  0    2  42  0      NaT          0
8   0  0    8  13  1 00:00:54          1
9   0  0    8  16  1 00:00:03          2
10  0  0    8  17  1 00:00:01          3
11  0  0    8  20  0      NaT          0
12  0  0    8  32  1      NaT          0

如果性能是很重要的,另一种解决方案:

b = m.cumsum()
df['increment'] = b-b.mask(m).ffill().fillna(0).astype(int)
© www.soinside.com 2019 - 2024. All rights reserved.