为了账号安全,请及时绑定邮箱和手机立即绑定

如果列值大于其他值,如何在Python中创建累积和列

如果列值大于其他值,如何在Python中创建累积和列

紫衣仙女 2023-09-26 14:04:03
我现在正在使用 pandas 获取累积总和列。但是,仅当其他列值大于其他列值时,该列才最多包含累积和。这是我当前数据的示例:Index     A       B       C0         1       20      31         10      15      112         20      12      253         30      18      324         40      32      175         50      12      4然后,如果B列大于C ,我想要Acumsum()列,否则值为零。原始结果D列应如下所示:dfIndex     A       B       C      D0         1       20      3      11         10      15      11     112         20      12      25     03         30      18      32     04         40      32      17     405         50      12      4      90我感谢您提前提供的任何支持。
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

df = pd.DataFrame({'A': {0: 1, 1: 10, 2: 20, 3: 30, 4: 40, 5: 50},

                   'B': {0: 20, 1: 15, 2: 12, 3: 18, 4: 32, 5: 12},

                   'C': {0: 3, 1: 11, 2: 25, 3: 32, 4: 17, 5: 4}})

为您的条件创建一个布尔系列并识别连续的 True 或 False 组


b_gt_c = df.B > df.C

groups = b_gt_c.ne(b_gt_c.shift()).cumsum()


In [107]: b_gt_c

Out[107]: 

0     True

1     True

2    False

3    False

4     True

5     True

dtype: bool


In [108]: groups

Out[108]: 

0    1

1    1

2    2

3    2

4    3

5    3

dtype: int32

按这些组分组;将每组的总和乘以条件;将结果分配给新的 df 列。


gb = df.groupby(groups)

for k,g in gb:

    df.loc[g.index,'D'] = g['A'].cumsum() * b_gt_c[g.index]


In [109]: df

Out[109]: 

    A   B   C     D

0   1  20   3   1.0

1  10  15  11  11.0

2  20  12  25   0.0

3  30  18  32   0.0

4  40  32  17  40.0

5  50  12   4  90.0

您也可以跳过 for 循环:


df['G'] = np.where(df.B.gt(df.C), df.A, np.NaN)

group = df.B.gt(df.C).ne(df.B.gt(df.C).shift()).cumsum()

df['G'] = df.groupby(group).G.cumsum().fillna(0)

查看完整回答
反对 回复 2023-09-26
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

可能有更优雅的解决方案,但这也有效。


我们首先创建两个虚拟列 - x 和 x_shift。


df.x 是有条件的,我们保留 df.A 的值,其中 df.B > df.C。


df.x_shift 是我们将值移到下面一行并用 0 填充 na 的地方。


在最后一步中,我们有条件地添加 df.A 和 df.x_shift,然后删除 df.x 和 df.x_shift


df['x'] = pd.DataFrame(np.where(df.B>df.C, df.A ,0))

df['x_shift'] = df.x.shift(1).fillna(0)

df['D'] = pd.DataFrame(np.where(df.B >df.C, df.A+df.x_shift,0))

df= df.drop(['x','x_shift'], axis=1


查看完整回答
反对 回复 2023-09-26
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

虽然这有点野蛮,但您可以转换为 numpy 数组,然后编写一个简单的 catch 来遍历 3 个数组并比较值。



查看完整回答
反对 回复 2023-09-26
  • 3 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信