比较下一行值并使用pandas python更改当前行值

时间:2018-07-16 09:11:04

标签: python pandas pandas-groupby

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

基本上在第一个数据帧DF1中,在值列中,值之一是“ 999”,因此该“用户ID”的下一行的值小于值“ 999”。因此在这种情况下,我想将“ 1000”即10 ^(len(999))添加到该“用户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的“值”列中的所有值执行此操作。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我有2种方法:

我们将这种方法乘以每个用户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)