将数据帧从多列重新整形为一列

时间:2016-04-14 15:28:33

标签: python pandas

我有一个像这样的数据框

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 

索引是datetime。第一列是该日期时间的数据。后续数据采用1 ms的间隔。因此,列[0]取自索引,列[1]在日期时间+ 1ms,列[2] =日期时间+ 2ms,... 是否有一种简单的方法来创建一个新的数据框,其中一列已计算所有日期时间并在索引中插入正确的位置?这些专栏有2500个!

1 个答案:

答案 0 :(得分:1)

确切的语法可能会有所不同,具体取决于您的具体方式。我从默认索引开始,时间存储在列'索引'并且是日期时间类型

>>> 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

第一步是堆叠数据,这样你就有了一个列,然后创建一个count-type列,告诉我们要为每个索引添加多少毫秒。

>>> 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