我有这样一个数据框
2014-11-26 09:05:19.669 -0.000610 0.000000 -0.001526 -0.000610 -0.000305
2014-11-26 09:05:20.169 -0.000610 -0.000610 0.000305 -0.000610 -0.000610
2014-11-26 09:05:20.669 -0.001831 -0.000916 -0.000610 0.000610 -0.000305
2014-11-26 09:05:21.169 -0.000916 -0.000305 -0.000305 -0.000610 -0.000610
2014-11-26 09:05:21.669 0.000000 -0.000916 -0.000610 -0.000305 -0.000610
2014-11-26 09:05:22.171 -0.001221 -0.000610 -0.000305 -0.000610 -0.000610
2014-11-26 09:05:22.669 -0.000916 -0.000305 0.000610 -0.000610 -0.000305
2014-11-26 09:05:23.169 -0.000610 -0.000610 -0.001221 -0.001221 -0.000610
索引是日期时间。第一列是该日期时间的数据。后续数据以 1 毫秒为间隔获取。因此,column[0] 在索引处获取,column[1] 在 datetime+1ms,column[2] = datetime+2ms,... 有没有一种简单的方法可以用一列创建一个新的数据框,其中所有日期时间都已计算并插入索引的正确位置?这些列有 2500 个!
最佳答案
此处的确切语法可能会有所不同,具体取决于您的开始方式。我从默认索引开始,时间存储在“索引”列中,类型为 datetime
>>> df
index x y z
0 2014-11-26 09:05:19.669 -0.000610 0.000000 -0.001526
1 2014-11-26 09:05:20.169 -0.000610 -0.000610 0.000305
2 2014-11-26 09:05:20.669 -0.001831 -0.000916 -0.000610
3 2014-11-26 09:05:21.169 -0.000916 -0.000305 -0.000305
第一步是堆叠数据,使您只有一列,然后创建一个计数类型的列,它会告诉我们要添加到每个索引的毫秒数。
>>> df2 = df.set_index('index').stack().reset_index()
>>> df2['cumcnt'] = df2.groupby('index',as_index=False).cumcount()
index level_1 0 cumcnt
0 2014-11-26 09:05:19.669 x -0.000610 0
1 2014-11-26 09:05:19.669 y 0.000000 1
2 2014-11-26 09:05:19.669 z -0.001526 2
3 2014-11-26 09:05:20.169 x -0.000610 0
4 2014-11-26 09:05:20.169 y -0.000610 1
5 2014-11-26 09:05:20.169 z 0.000305 2
6 2014-11-26 09:05:20.669 x -0.001831 0
7 2014-11-26 09:05:20.669 y -0.000916 1
8 2014-11-26 09:05:20.669 z -0.000610 2
9 2014-11-26 09:05:21.169 x -0.000916 0
10 2014-11-26 09:05:21.169 y -0.000305 1
11 2014-11-26 09:05:21.169 z -0.000305 2
然后将“cumcnt”列与 1 毫秒的 TimeDelta 相乘,仅此而已...
>>> df2['index'] = df2['index'] + pd.to_timedelta('1ms') * df2['cumcnt']
index level_1 0 cumcnt
0 2014-11-26 09:05:19.669 x -0.000610 0
1 2014-11-26 09:05:19.670 y 0.000000 1
2 2014-11-26 09:05:19.671 z -0.001526 2
3 2014-11-26 09:05:20.169 x -0.000610 0
4 2014-11-26 09:05:20.170 y -0.000610 1
5 2014-11-26 09:05:20.171 z 0.000305 2
6 2014-11-26 09:05:20.669 x -0.001831 0
7 2014-11-26 09:05:20.670 y -0.000916 1
8 2014-11-26 09:05:20.671 z -0.000610 2
9 2014-11-26 09:05:21.169 x -0.000916 0
10 2014-11-26 09:05:21.170 y -0.000305 1
11 2014-11-26 09:05:21.171 z -0.000305 2
关于python - 将数据框从多列 reshape 为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36627601/