gpt4 book ai didi

python - 通过 Pandas 系列中的多个实例计算第一个非零值和最后一个非零值之间的差异?

转载 作者:行者123 更新时间:2023-11-28 22:27:00 25 4
gpt4 key购买 nike

我有一个 DataFrame,col_c 列的值为 0,正整数为 0,负整数为 0。我想返回一个新列(如下所示的 col_d),其中的值计算第一个非零值和第一个非零值之间的差值最后一个非零值。原始 DataFrame 演示了 col_c 值:

   col_a col_b col_c
1 AB 0 0
2 AB 0 0
3 AB 1 1
4 AB 1 2
5 AB 1 5
6 AB 1 3
7 AB 0 0
8 AB 0 0
9 AB -1 -1
10 AB -1 -2
11 AB -1 -5
12 AB -1 -3
13 AB 0 0
14 AB 0 0

我想按如下方式返回一个 DataFrame,其中第 6 行和第 12 行中的值 2 从 col_c 计算为 (3-1) = 2 和 (-3 - -1) = -2:

   col_a col_b col_c col_d
1 AB 0 0 0
2 AB 0 0 0
3 AB 1 1 0
4 AB 1 2 0
5 AB 1 5 0
6 AB 1 3 2
7 AB 0 0 0
8 AB 0 0 0
9 AB -1 -1 0
10 AB -1 -2 0
11 AB -1 -5 0
12 AB -1 -3 2
13 AB 0 0 0
14 AB 0 0 0

最佳答案

高级

  • 找到零:df.col_c.eq(0)
  • 使用cumsum创建组
  • -1替换实际的零位置因为这是我关心的非零值
  • 执行 groupbyagg
    • 'last'小组最后一名
    • 'first'获得小组第一
    • 'last_valid_index弄清楚把它放在哪里
    • 放下-1分组,因为那些是我不关心的零
  • 使用来自 last_valid_index 的结果键创建一个字典和值是 'last' 之间的差异和 'first'
  • 使用 assign 创建新列和 index.map
    • index.map需要一个可调用对象,所以我使用 dict.get方法。但是,我们希望默认为零,这样很方便 dict.get可以取默认值。

m = df.col_c.eq(0)
g = m.cumsum().mask(m, -1)

d = df.col_c.groupby(g).agg(['last', 'first', lambda x: x.last_valid_index()]).drop(-1)
k = dict(zip(d['<lambda>'], d['last'] - d['first']))

df.assign(col_d=df.index.map(lambda x: k.get(x, 0)))

col_a col_b col_c col_d
1 AB 0 0 0
2 AB 0 0 0
3 AB 1 1 0
4 AB 1 2 0
5 AB 1 5 0
6 AB 1 3 2
7 AB 0 0 0
8 AB 0 0 0
9 AB -1 -1 0
10 AB -1 -2 0
11 AB -1 -5 0
12 AB -1 -3 -2
13 AB 0 0 0
14 AB 0 0 0

关于python - 通过 Pandas 系列中的多个实例计算第一个非零值和最后一个非零值之间的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com