pandas.DataFrame中列的反转累积和

时间:2016-06-17 03:20:31

标签: python pandas dataframe reverse

我有一个pandas DataFrame,其布尔列按另一列排序,需要计算布尔列的反向累积和,即从当前行到底部的真值的数量。

实施例

y

我需要的东西会给我一个带有值的新列

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

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

我已尝试使用3 3 2 2 2 2 1 1 的各种方法,但结果并非如此。

想想,我错过了一件明显的事情。我昨天才开始使用熊猫。

4 个答案:

答案 0 :(得分:18)

反转A栏,取出cumsum,然后再反转:

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)

产量

       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

或者,您可以计算True列中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

答案 1 :(得分:6)

类似于unutbus的第一个建议,但没有弃用的ix:

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

答案 2 :(得分:0)

这有效但很慢......就像@unutbu的回答一样。 True解析为1.但是False或其他任何值都失败。

$compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|file|content|blob‌​|ms-appx|ms-appdata|x-wmapp0|unsafe|local):|data:image\//);

答案 3 :(得分:0)

如果要逐列逆转累积总和:

(-df).cumsum(axis=1).add(1).shift(1,axis=1,fill_value=1.0)