反转pandas.DataFrame中一列的累积总和

我有一个pandas DataFrame,其中的boolean列由另一列排序,并且需要计算boolean列的反向累加总和,即从当前行到底部的真值数量。

Example

In [13]: df = pd.DataFrame({'A': [True] * 3 + [False] * 5, 'B': np.random.rand(8) })

In [15]: df = df.sort_values('B')

In [16]: df

Out[16]:

A B

6 False 0.037710

2 True 0.315414

4 False 0.332480

7 False 0.445505

3 False 0.580156

1 True 0.741551

5 False 0.796944

0 True 0.817563

我需要一些可以为我提供新值的列

3

3

2

2

2

2

1

1

也就是说,对于每一行,此行和下面的行应包含一定数量的True值。

我已经尝试过使用各种方法,.iloc[::-1]但是结果不是所希望的。

看来我缺少一些明显的信息。我昨天才开始使用pandas。

回答:

反转A列,取总和,然后再次反转:

df['C'] = df.loc[::-1, 'A'].cumsum()[::-1]


import pandas as pd

df = pd.DataFrame(

{'A': [False, True, False, False, False, True, False, True],

'B': [0.03771, 0.315414, 0.33248, 0.445505, 0.580156, 0.741551, 0.796944, 0.817563],},

index=[6, 2, 4, 7, 3, 1, 5, 0])

df['C'] = df.loc[::-1, 'A'].cumsum()[::-1]

print(df)

yields

       A         B  C

6 False 0.037710 3

2 True 0.315414 3

4 False 0.332480 2

7 False 0.445505 2

3 False 0.580156 2

1 True 0.741551 2

5 False 0.796944 1

0 True 0.817563 1


另外,您可以计算Trues列中的s数量,A然后减去(移位的)总和:

In [113]: df['A'].sum()-df['A'].shift(1).fillna(0).cumsum()

Out[113]:

6 3

2 3

4 2

7 2

3 2

1 2

5 1

0 1

Name: A, dtype: object

但这要慢得多。使用IPython的,以执行基准:

In [116]: df = pd.DataFrame({'A':np.random.randint(2, size=10**5).astype(bool)})

In [117]: %timeit df['A'].sum()-df['A'].shift(1).fillna(0).cumsum()

10 loops, best of 3: 19.8 ms per loop

In [118]: %timeit df.loc[::-1, 'A'].cumsum()[::-1]

1000 loops, best of 3: 701 µs per loop

以上是 反转pandas.DataFrame中一列的累积总和 的全部内容, 来源链接: utcz.com/qa/403982.html

回到顶部