为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫将值与具有过滤条件的前一行进行比较

熊猫将值与具有过滤条件的前一行进行比较

蝴蝶不菲 2021-06-02 21:21:31
我有一个包含员工工资信息的 DataFrame。它大约有 900000+ 行。样本:+----+-------------+---------------+----------+|    |   table_num | name          |   salary ||----+-------------+---------------+----------||  0 |      001234 | John Johnson  |     1200 ||  1 |      001234 | John Johnson  |     1000 ||  2 |      001235 | John Johnson  |     1000 ||  3 |      001235 | John Johnson  |     1200 ||  4 |      001235 | John Johnson  |     1000 ||  5 |      001235 | Steve Stevens |     1000 ||  6 |      001236 | Steve Stevens |     1200 ||  7 |      001236 | Steve Stevens |     1200 ||  8 |      001236 | Steve Stevens |     1200 |+----+-------------+---------------+----------+数据类型:table_num: stringname: stringsalary: float我需要添加一列有关增加\减少工资水平的信息。我正在使用该shift()函数来比较行中的值。主要问题在于对整个数据集的所有唯一员工进行过滤和迭代。在我的脚本中大约需要 3 个半小时。怎么做比较快?
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

使用groupby连同diff

df['inc'] = df.groupby(['table_num', 'name'])['salary'].diff().fillna(0.0)
df.loc[df['inc'] > 0.0, 'inc'] = 1.0
df.loc[df['inc'] < 0.0, 'inc'] = -1.0


查看完整回答
反对 回复 2021-06-06
?
喵喔喔

TA贡献1735条经验 获得超5个赞

使用DataFrameGroupBy.diffwithnumpy.sign和 last cast to integers:

df['new'] = np.sign(df.groupby(['table_num', 'name'])['salary'].diff().fillna(0)).astype(int)

print (df)

   table_num           name  salary  new

0       1234   John Johnson    1200    0

1       1234   John Johnson    1000   -1

2       1235   John Johnson    1000    0

3       1235   John Johnson    1200    1

4       1235   John Johnson    1000   -1

5       1235  Steve Stevens    1000    0

6       1236  Steve Stevens    1200    0

7       1236  Steve Stevens    1200    0

8       1236  Steve Stevens    1200    0


查看完整回答
反对 回复 2021-06-06
  • 3 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信