我有个df
data = [[1, 10], [1, 5], [1, 4], [0, 3], [0, 3], [1, 2], [1, 1], [1, 5], [2, 8], [4, 9]]
df = pd.DataFrame(data, columns = ['no', 'count'])
将值打印为,
no count
1 10
1 5
1 4
0 3
0 3
1 2
1 1
1 5
2 8
4 9
H 111
最后,计算和H 212F 213
预期产出:(10-3) =7和(2-8) = -6
7
-6
苏姆是,
1
发布于 2021-06-15 13:09:31
有一种方法:
>>> vals = df.groupby(df.no.eq(1).diff().ne(0).cumsum())["count"].first()
>>> result = (vals * (-1) ** np.arange(len(vals))).sum()
>>> result
1
在这里,我们首先通过连续的组对它们进行分组,它们是否为1,并取其中的第一个值。然后用(-1)
的幂对0..N-1
值加一个交替符号,然后对乘法进行求和。
顺便说一句,vals
是这样的:
1 10
2 3
3 2
4 8
另一种不加-1的权力:
vals = df.groupby(df.no.eq(1).diff().ne(0).cumsum())["count"].first().to_numpy()
result = (vals[::2] - vals[1::2]).sum()
从偶数索引值中减去奇数索引值。
另一种基于itertools.groupby
的方法是1次传递数据:
from itertools import groupby
from operator import itemgetter
iterable = enumerate(groupby(zip(df["no"].eq(1), df["count"]), key=itemgetter(0)))
result = sum((1-2*(j&1)) * next(gr)[1] for j, (_, gr) in iterable)
它用枚举和j
的奇偶来动态地确定符号,但不是那么可读的。
发布于 2021-06-15 13:14:18
使用groupby df['no'].eq(1)
(m
)和m.ne(m.shift()).cumsum()
的另一种方法
m = df['no'].eq(1)
g = (
df.groupby([m, m.ne(m.shift()).cumsum()])['count'].first()
)
no no
False 2 3
4 8
True 1 10
3 2
Name: count, dtype: int64
然后从True
no中减去False
no:
g.loc[True].values - g.loc[False].values
[ 7 -6]
和sum
(g.loc[True].values - g.loc[False].values).sum()
1
https://stackoverflow.com/questions/67986799
复制相似问题