首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于条件计算行和

基于条件计算行和
EN

Stack Overflow用户
提问于 2021-06-15 13:02:43
回答 2查看 119关注 0票数 1

我有个df

代码语言:javascript
运行
复制
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'])

将值打印为,

代码语言:javascript
运行
复制
no  count
1    10   
1    5
1    4
0    3
0    3
1    2
1    1
1    5
2    8
4    9 

  • I想在"no“变成1(考虑为值1)
  • 时得到第一个”计数“,当数字为"not 1”时,得到"count“(考虑为值2)
  • 减去value2 -value1
  • 开始下一个值时再次变为1。

H 111最后,计算和H 212F 213

预期产出:(10-3) =7和(2-8) = -6

代码语言:javascript
运行
复制
7
-6

苏姆是,

代码语言:javascript
运行
复制
1
EN

回答 2

Stack Overflow用户

发布于 2021-06-15 13:09:31

有一种方法:

代码语言:javascript
运行
复制
>>> 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是这样的:

代码语言:javascript
运行
复制
1    10
2     3
3     2
4     8

另一种不加-1的权力:

代码语言:javascript
运行
复制
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次传递数据:

代码语言:javascript
运行
复制
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的奇偶来动态地确定符号,但不是那么可读的。

票数 2
EN

Stack Overflow用户

发布于 2021-06-15 13:14:18

使用groupby df['no'].eq(1) (m)和m.ne(m.shift()).cumsum()的另一种方法

代码语言:javascript
运行
复制
m = df['no'].eq(1)
g = (
    df.groupby([m, m.ne(m.shift()).cumsum()])['count'].first()
)
代码语言:javascript
运行
复制
no     no
False  2      3
       4      8
True   1     10
       3      2
Name: count, dtype: int64

然后从True no中减去False no:

代码语言:javascript
运行
复制
g.loc[True].values - g.loc[False].values
代码语言:javascript
运行
复制
[ 7 -6]

sum

代码语言:javascript
运行
复制
(g.loc[True].values - g.loc[False].values).sum()
代码语言:javascript
运行
复制
1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67986799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档