我有数据帧
atm_id dNDCSessionTime sCardNumber nTrRequestCount
152865 0 2017-01-14 07:56:17 1 1
153052 0 2017-01-14 08:01:13 1 1
153053 0 2017-01-14 08:02:19 1 1
153054 0 2017-01-14 08:03:41 1 1
152804 0 2017-01-14 08:04:37 1 1
152805 0 2017-01-14 08:05:24 1 1
152806 1 2017-01-14 08:06:08 1 1
152807 1 2017-01-14 08:07:15 1 1
152808 1 2017-01-14 08:08:08 1 1
152866 1 2017-01-14 08:08:50 1 1
我需要添加新的列,也就是说,周期(对于每个atm_id,每3个事务(数据帧中的字符串))
期望输出
atm_id dNDCSessionTime sCardNumber nTrRequestCount period
152865 0 2017-01-14 07:56:17 1 1 1
153052 0 2017-01-14 08:01:13 1 1 1
153053 0 2017-01-14 08:02:19 1 1 1
153054 0 2017-01-14 08:03:41 1 1 2
152804 0 2017-01-14 08:04:37 1 1 2
152805 0 2017-01-14 08:05:24 1 1 2
152806 1 2017-01-14 08:06:08 1 1 3
152807 1 2017-01-14 08:07:15 1 1 3
152808 1 2017-01-14 08:08:08 1 1 3
152866 1 2017-01-14 08:08:50 1 1 4
我试着用它来做这件事
df['period'] = df.sort_values(['atm_id', 'dNDCSessionTime']).groupby('atm_id').shift(500)
但我有个错误
如果像在您的示例中一样,每个“atm_id”的行数是3的倍数,那么您可以使用
iloc[::3]
来选择每3行现在,我假设在一个
atm_id
中不会总是有许多行是3的倍数,所以可以通过groupby
和apply
来进行。我用atm_id = 2
在您的输入中添加了一行来说明这一点。如果您这样做:因此,在同一个
atm_id
中每3行就得到一次。在这里,不同的解决方案可以使用df
中的上述信息,我的方法是按索引编号,假设您的数据中有唯一的。创建一个带有原始索引号的mask
,并使用与上面相同的方法结果是
其中,您可以看到最后两行之间从4到5的增量,而更改
atm_id
时Period=4
没有3行注意:如果您的索引不是唯一的,那么开头的
reset_index
和结尾的set_index
返回将给出相同的结果,而且我没有像您那样sort_values
,但这不是问题相关问题 更多 >
编程相关推荐