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

2024-05-14 03:54:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在使用pandas获取累积和列。但是,只有当其他列的值大于其他列的值时,此列才包含累积和。以下是我当前数据的一个示例:

Index     A       B       C
0         1       20      3
1         10      15      11
2         20      12      25
3         30      18      32
4         40      32      17
5         50      12      4

然后我想cumsum()A如果列B大于C,如果非值为零。原始df中的结果列D应如下所示:

Index     A       B       C      D
0         1       20      3      1
1         10      15      11     11
2         20      12      25     0
3         30      18      32     0
4         40      32      17     40
5         50      12      4      90

我感谢您的支持


Tags: 数据示例pandasdfindexcumsum非值
3条回答

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

可能还有更为持久的解决方案,但这也行得通

我们首先创建两个伪列-x和x_shift

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

df.x_shift是将值移到下面一行,并用0填充na

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

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
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}})

为您的条件创建一个布尔序列,并标识连续的真或假组

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)

识别SO Q&;中连续出现的值;A:Grouping dataframe based on consecutive occurrence of values

相关问题 更多 >