python - 将数据框从多列 reshape 为一列

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

索引是日期时间。第一列是该日期时间的数据。后续数据以 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/

相关文章:

python - 为什么网站上的简单模型链示例正在计算负交流功率?

python - 将 UNIX python 程序转换为在 Windows 中运行

python - 如何在 python 中创建一个简单且安全的 Socks5 代理?

python - 将 Pandas 数据框单元格中的字典解析为新行单元格(新列)

python - 使用来自另一个 Pandas 数据框的信息填充 Pandas 数据框

python - 使用 Pandas Groupby 和 date_range 进行时间序列分析时出错

python - 追加到 Python 字典中的列表

python ,heapq : difference between heappushpop() and heapreplace()

python - 将颜色分配/映射到 Seaborn.regplot (Python 3) 中的点

python - Pandas 重新采样引发由日期时间对象组成的索引的类型错误