python - 比较下一行值并使用 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 的“值”列中的所有值执行此操作。
有什么建议么?
解决方案
我有两种方法:
我们将这个方法乘以每个用户 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)
推荐阅读
- javascript - 如何在浏览器中打开的选项卡上访问 react chrome 扩展的路由?
- python - Django 在“auth”应用程序中缺少迁移
- php - Laravel 密码重置不起作用
- python - Pandas 整数过滤
- android - RecyclerView 与本地主机一起工作,但不显示在线服务器的项目
- linux-kernel - 为 ARM 创建 Linux uImage 后 QEMU 显示黑屏
- c# - WPF 应用程序在调试中运行,单击按钮后部署时崩溃
- laravel - Vue 组件无法在实时服务器上运行
- c++ - 用于读取 std::vector 的模板函数
来自流 - html - 对齐导航栏/缩小下拉菜单框