Pandas Shift将Ints转换为Float和Rounds

guy*_*guy 5 python rounding pandas

当移动整数列时,我知道当Pandas因为存在NaN而自动将整数转换为浮点数时如何修复我的列. 我基本上使用这里描述的方法.

但是,如果移位引入了NaN,从而将所有整数转换为浮点数,则会发生一些舍入(例如,在纪元时间戳上),因此即使将其重新转换为整数也不会复制它原来的内容.

有任何解决这个问题的方法吗?

示例数据:

pd.DataFrame({'epochee':[1495571400259317500,1495571400260585120,1495571400260757200, 1495571400260866800]})
Out[19]: 
                 epoch
0  1495571790919317503
1  1495999999999999999
2  1495571400265555555
3  1495571400267777777
Run Code Online (Sandbox Code Playgroud)

示例代码:

df['prior_epochee'] = df['epochee'].shift(1)
df.dropna(axis=0, how='any', inplace=True)
df['prior_epochee'] = df['prior_epochee'].astype(int)
Run Code Online (Sandbox Code Playgroud)

结果输出:

Out[22]: 
                 epoch          prior_epoch
1  1444444444444444444  1400000000000000000
2  1433333333333333333  1490000000000000000
3  1777777777777777777  1499999999999999948
Run Code Online (Sandbox Code Playgroud)

piR*_*red 1

int因为您知道当被强制转换为浮动时会发生什么np.nan 并且您知道无论如何您都不想要这些np.nan行,所以您可以使用numpy

df[1:].assign(prior_epoch=df.epoch.values[:-1])

                 epoch          prior_epoch
1  1495571400260585120  1495571400259317500
2  1495571400260757200  1495571400260585120
3  1495571400260866800  1495571400260757200
Run Code Online (Sandbox Code Playgroud)