1

私は次のようなdfを持っています

A    B
1.2  1
1.3  1
1.1  1
1.0  0
1.0  0
1.5  1
1.6  1
0.7  1
1.1  0

cumsum を 1 つずつ計算する関数または方法はありますか。つまり、連続する B 値 1 ごとに、cumsum を計算します。上記の例では、次のようになります。

A    B    C
1.2  1    1.2
1.3  1    2.5
1.1  1    3.6
1.0  0    0
1.0  0    0
1.5  1    1.5
1.6  1    3.1
0.7  1    3.8
1.1  0    0

どうもありがとう、

4

3 に答える 3

2
from io import StringIO
import pandas as pd
import numpy as np

text = """a  b
1.2  1
1.3  1
1.1  1
1.0  0
1.0  0
1.5  1
1.6  1
0.7  1
1.1  0"""

df = pd.read_csv(StringIO(text), delim_whitespace=True)

c = df["a"].cumsum()
mask = ~df["b"].astype(bool)
s = pd.Series(np.nan, index=df.index)
s[mask] = c[mask]
c -= s.ffill().fillna(0)
print(c)

出力:

0    1.2
1    2.5
2    3.6
3    0.0
4    0.0
5    1.5
6    3.1
7    3.8
8    0.0
dtype: float64
于 2013-09-11T06:41:27.693 に答える
2

別のアプローチ (もう少し一般的かもしれません) は、B の連続するエントリを groupby することです。

まず、グループを列挙します。

In [11]: (df.B != df.B.shift())
Out[11]: 
0     True
1    False
2    False
3     True
4    False
5     True
6    False
7    False
8     True
Name: B, dtype: bool

In [12]: enumerate_B_changes = (df.B != df.B.shift()).astype(int).cumsum()

In [13]: enumerate_B_changes
Out[13]: 
0    1
1    1
2    1
3    2
4    2
5    3
6    3
7    3
8    4
dtype: int64

そして、このシリーズと cumsum でグループ化できます。

In [14]: df.groupby(enumerate_B_changes)['A'].cumsum()
Out[14]: 
0    1.2
1    2.5
2    3.6
3    1.0
4    2.0
5    1.5
6    3.1
7    3.8
8    1.1
dtype: float64

ただし、この場合、列 B の 0 を考慮して df['B'] を掛ける必要があります。

In [15]: df.groupby(enumerate_B_changes)['A'].cumsum() * df['B']
Out[15]: 
0    1.2
1    2.5
2    3.6
3    0.0
4    0.0
5    1.5
6    3.1
7    3.8
8    0.0
dtype: float64

0 でも 1 でもない整数に対して別の操作が必要な場合は、ここで別の操作を行うことができます。

于 2013-09-11T09:47:36.907 に答える
1

私はnumpyに精通していませんが、以下のコードが役立つはずです。

それは通過し、b1 の場合は累積合計に追加し続け、それ以外の場合はリセットします。

df = [
(1.2, 1),
(1.3, 1),
(1.1, 1),
(1.0, 0),
(1.0, 0),
(1.5, 1),
(1.6, 1),
(0.7, 1),
(1.1, 0)]

c=[]
cumsum=0
for a,b in df:
    if b == 1:
        cumsum +=a
        c.append(cumsum)
    else:
        cumsum = 0
        c.append(0)
print c

そして、それは出力します(numpyでは発生しないはずの丸めの問題があります):

[1.2, 2.5, 3.6000000000000001, 0, 0, 1.5, 3.1000000000000001, 3.7999999999999998, 0]
于 2013-09-11T05:38:29.313 に答える