将行值与下一个行值进行比较并使用熊猫更改当前行值的任何方法?
基本上在第一个数据帧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的“值”列中的所有值执行此操作。
有什么建议吗?
答案 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)