首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pandas.groupby()和累计()进行逐行条件检查和替换

使用pandas.groupby()和累计()进行逐行条件检查和替换
EN

Stack Overflow用户
提问于 2022-06-08 19:05:01
回答 2查看 142关注 0票数 0

我们有一个数据,df,它有四个变量A,B,C和D。

变量A有两个级别1、2和3(仅在本例中)。

变量B、C和D是连续变量。

基于A和B的C柱填充公式是

代码语言:javascript
复制
df['C'] = 150 - df['B'].groupby(df['A']).cumsum()

想要的结果在D列

基本上,C列中的值不能取大于150和<0的值。例如,在索引24中,用163.5>150替换C列为D列中的150个。随后行中的值会发生变化。同样,在索引28中,C列的值为150-180=-30<0;因此,在D列中替换为0,随后行中的值将发生变化。

df

代码语言:javascript
复制
ID      A       B       C       D
0       1       21      129     129
1       1       -1.5    130.5   130.5
2       1       -1.5    132     132
3       1       13.5    118.5   118.5
4       1       13.5    105     105
5       1       13.5    91.5    91.5
6       2       21      129     129
7       2       -1.5    130.5   130.5
8       2       6       124.5   124.5
9       2       13.5    111     111
10      2       13.5    97.5    97.5
11      2       13.5    84      84
12      2       13.5    70.5    70.5
13      2       -9      79.5    79.5
14      2       6       73.5    73.5
15      2       -9      82.5    82.5
16      2       6       76.5    76.5
17      2       -1.5    78      78
18      2       13.5    64.5    64.5
19      2       -1.5    66      66
20      2       13.5    52.5    52.5
21      2       13.5    39      39
22      2       -106.5  145.5   145.5
23      2       6       139.5   139.5
24      2       -24     163.5   150
25      2       6       157.5   144
26      2       13.5    144     130.5
27      2       13.5    130.5   117
28      3       180     -30     0
29      3       -9      -21     9
30      3       6       -27     3
31      3       -1.5    -25.5   4.5
32      3       13.5    -39     0
33      3       -1.5    -37.5   1.5
34      3       13.5    -51     0
35      3       -24     -27     24

注意事项

请参阅第24号索引C栏和D栏之间的变化。

用于计算指数24至35的D栏数值的公式如下:

代码语言:javascript
复制
ID  formula
24  163.5>150 (SET TO 150)
25  150-6=144
26  144-13.5=130.5
27  130.5-13.5=117
28  150-180=-30 (SET TO 0)
29  0-(-9)=9
30  9-6=3
31  3-(-1.5)=4.5
32  4.5-13.5=-9 (SET TO 0)
33  0-(-1.5)=1.5
34  1.5-13.5=-12 (SET TO 0)
35  0-(-24)=24
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-09 12:17:10

代码语言:javascript
复制
import pandas as pd

qqq = []
def func_data(x):
    aaa = 150
    for i in x:
        aaa -=i
        if aaa > 150:
            aaa =150
        if aaa < 0:
            aaa = 0
        qqq.append(aaa)


df['F'] = df.groupby(['A'])['B'].apply(func_data)
df['F'] = qqq
print(df)

输出

代码语言:javascript
复制
    ID  A      B      C      D      F
0    0  1   21.0  129.0  129.0  129.0
1    1  1   -1.5  130.5  130.5  130.5
2    2  1   -1.5  132.0  132.0  132.0
3    3  1   13.5  118.5  118.5  118.5
4    4  1   13.5  105.0  105.0  105.0
5    5  1   13.5   91.5   91.5   91.5
6    6  2   21.0  129.0  129.0  129.0
7    7  2   -1.5  130.5  130.5  130.5
8    8  2    6.0  124.5  124.5  124.5
9    9  2   13.5  111.0  111.0  111.0
10  10  2   13.5   97.5   97.5   97.5
11  11  2   13.5   84.0   84.0   84.0
12  12  2   13.5   70.5   70.5   70.5
13  13  2   -9.0   79.5   79.5   79.5
14  14  2    6.0   73.5   73.5   73.5
15  15  2   -9.0   82.5   82.5   82.5
16  16  2    6.0   76.5   76.5   76.5
17  17  2   -1.5   78.0   78.0   78.0
18  18  2   13.5   64.5   64.5   64.5
19  19  2   -1.5   66.0   66.0   66.0
20  20  2   13.5   52.5   52.5   52.5
21  21  2   13.5   39.0   39.0   39.0
22  22  2 -106.5  145.5  145.5  145.5
23  23  2    6.0  139.5  139.5  139.5
24  24  2  -24.0  163.5  150.0  150.0
25  25  2    6.0  157.5  144.0  144.0
26  26  2   13.5  144.0  130.5  130.5
27  27  2   13.5  130.5  117.0  117.0
28  28  3  180.0  -30.0    0.0    0.0
29  29  3   -9.0  -21.0    9.0    9.0
30  30  3    6.0  -27.0    3.0    3.0
31  31  3   -1.5  -25.5    4.5    4.5
32  32  3   13.5  -39.0    0.0    0.0
33  33  3   -1.5  -37.5    1.5    1.5
34  34  3   13.5  -51.0    0.0    0.0
35  35  3  -24.0  -27.0   24.0   24.0

Apply有一个func_data函数来测试条件和设置值。结果是一个qqq数组,设置为F列。

票数 1
EN

Stack Overflow用户

发布于 2022-06-09 12:23:48

我不确定我是否正确理解了这个问题,因为不清楚为什么在24号索引中你提到了C列,或者为什么在指数28中,计算值是150-180=-30,而不是117-180=-63。

如果不使用for循环,我想不出解决这个问题的方法。

this答案的帮助下,这应该是可行的:

代码语言:javascript
复制
df2.loc[0, 'D'] = df2.loc[0, 'C']  # this set the first value in column D, now it's the same value as in column C.
for i in range(1, len(df2)):
    val = df2.loc[i-1, 'D'] - df2.loc[i,'B']
    if val > 150:
        val = 150
    if val < 0:
        val = 0
    df2.loc[i, 'D'] = val
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72550951

复制
相关文章

相似问题

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