从几个数据帧构建一个numpy数组(矩阵)

时间:2016-05-24 23:06:02

标签: python-2.7 numpy pandas

我有几个具有相同外观但数据不同的数据帧。

DataFrame 1

                          bid
                        close
time                         
2016-05-24 00:00:00       NaN
2016-05-24 00:05:00  0.000611
2016-05-24 00:10:00 -0.000244
2016-05-24 00:15:00 -0.000122

DataFrame 2

                          bid
                        close
time                         
2016-05-24 00:00:00       NaN
2016-05-24 00:05:00  0.000811
2016-05-24 00:10:00 -0.000744
2016-05-24 00:15:00 -0.000322

我需要构建一个数据帧列表,然后将该数据帧列表传递给一个可以获取数据帧列表并将其转换为numpy数组的函数。如下所示,矩阵中的每个条目都是数据框的元素(' bid                         关闭')列。请注意,我不需要索引' time'柱

data = np.array([dataFrames])

返回此(示例不是实际数据)

[[-0.00114415  0.02502565  0.00507831 ...,  0.00653057  0.02183072
  -0.00194293] `DataFrame` 1 is here ignore that the data doesn't match above
 [-0.01527224  0.02899528 -0.00327654 ...,  0.0322364   0.01821731
  -0.00766773] `DataFrame` 2 is here ignore that the data doesn't match above
 ....]]

2 个答案:

答案 0 :(得分:1)

尝试

master_matrix = pd.concat(list_of_dfs, axis=1)
master_matrix = master_matrix.values.reshape(master_matrix.shape, order='F')

如果最终矩阵中的每一行对应于相同的日期

master_matrix = pd.concat(list_of_dfs, axis=1).values

否则。

编辑以解决新添加的示例。 在这种情况下,您可以对每个数据帧返回的列使用np.vstack

import pandas as pd
import numpy as np
from io import StringIO

df1 = pd.read_csv(StringIO(
'''
time                bid_close
2016-05-24 00:00:00       NaN
2016-05-24 00:05:00  0.000611
2016-05-24 00:10:00 -0.000244
2016-05-24 00:15:00 -0.000122
'''), sep=r' +')

df2 = pd.read_csv(StringIO(
'''
time                bid_close
2016-05-24 00:00:00       NaN
2016-05-24 00:05:00  0.000811
2016-05-24 00:10:00 -0.000744
2016-05-24 00:15:00 -0.000322
'''), sep=r' +')

dfs = [df1, df2]

out = np.vstack(df.iloc[:,-1].values for df in dfs)

结果:

In [10]: q.out
Out[10]:
array([[      nan,  0.000611, -0.000244, -0.000122],
       [      nan,  0.000811, -0.000744, -0.000322]])

答案 1 :(得分:1)

设置

import pandas as pd
import numpy as np

df1 = pd.DataFrame([1, 2, 3, 4],
                   index=pd.date_range('2016-04-01', periods=4),
                   columns=pd.MultiIndex.from_tuples([('bid', 'close')]))
df2 = pd.DataFrame([5, 6, 7, 8],
                   index=pd.date_range('2016-03-01', periods=4),
                   columns=pd.MultiIndex.from_tuples([('bid', 'close')]))
print df1

             bid
           close
2016-04-01     1
2016-04-02     2
2016-04-03     3
2016-04-04     4

print df2

             bid
           close
2016-03-01     5
2016-03-02     6
2016-03-03     7
2016-03-04     8

解决方案

df = np.concatenate([d.T.values for d in [df1, df2]])

print df

[[1 2 3 4]
 [5 6 7 8]]

注意

指数不需要排列。这只是从每个数据框中获取原始np.array,然后使用np.concatenate完成剩下的工作。