首页 > 解决方案 > 比较下一行值并使用 pandas python 更改当前行值

问题描述

任何方式将行值与下一行值进行比较并使用熊猫更改当前行值?

基本上在第一个数据框 DF1 中,值列中的一个值是“999”,因此该“用户 ID”的下一行的值小于值“999”。所以在这种情况下,我想将 10^(len(999)) 的“1000”添加到该“用户 ID”的所有连续值中。

我尝试使用 shift,但我发现它通过给出“Null”跳过了其中一个行值。而且我也不确定如何在不创造新价值的情况下做到这一点。

例如,如果这是我拥有的数据集,DF1

user-id      serial-number       value     day

1   2   10      1
1   2   20      2
1   2   30      3
1   2   40      4
1   2   50      5
1   2   60      6
1   2   70      7
1   2   80      8
1   2   90      9
1   2   100    10
1   2   999    11
1   2   300    12
1   2   400    13
2   3   11      1
2   3   12      2
2   3   13      3
2   3   14      4
2   3   99      5
2   3   16      6
2   3   17      7
2   3   18      8

我需要生成的数据框为 DF1:

user-id     serial-number    value      day

1   2     10     1
1   2     20     1
1   2     30     1
1   2     40     1
1   2     50     1
1   2     60     1
1   2     70     1
1   2     80     1
1   2     90     1 
1   2     100    1 
1   2     999    1 
1   2     1300   1
1   2     1400   1
.   .
2   3     11     1
2   3     12     1
2   3     13     1
2   3     14     1
2   3     99     1
2   3     116    1
2   3     117    1
2   3     118    1

我想我已经正确解释了这个问题。

同样,我想为每个用户 ID 的“值”列中的所有值执行此操作。

有什么建议么?

标签: pythonpandaspandas-groupby

解决方案


我有两种方法:

我们将这个方法乘以每个用户 ID 的最大值 - 它适用于您提供的示例数据集,但它可能无法整体工作。

df.set_index('user-id', inplace=True)
df['value'] += df.groupby('user-id')['value'].apply(
lambda x:(x.shift() > x).astype(int).cumsum()
) * 10**df.groupby('user-id')['value'].max().apply(lambda x: len(str(x)))

另一个是循环遍历每个项目:

def foo(x):
    for i in range(1,len(x)):
        if x.iloc[i] < x.iloc[i-1]:
            x.iloc[i:] = x.iloc[i:] + 10**(len(str(x.iloc[i-1])))
    return x

df['value'] = df.groupby('user-id')['value'].apply(foo)

推荐阅读