【问题标题】:Building a numpy array (matrix) from several dataframes从多个数据帧构建一个 numpy 数组(矩阵)
【发布时间】:2016-09-22 08:38:34
【问题描述】:

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

数据帧 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

数据帧 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 关闭') 列。注意我不需要索引“时间”列

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

【问题讨论】:

    标签: python-2.7 numpy pandas


    【解决方案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 来完成其余的工作。

    【讨论】:

    • 谢谢。不确定上面使用哪个或这个。
    【解决方案2】:

    试试

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

    【讨论】:

    • 返回一个numpy数组?
    • 命名错误;固定的。一般来说,df.values 返回一个 numpy 数组。
    • 这很酷很接近,但不是我需要的。这是结果 [ 6.11097531e-04 -7.07217396e-05 -9.88878916e-05 -6.22477917e-05 -1.05367416e-05] 我需要每一行中的整个数据框。因此,它与数据帧中的数据一样宽,与数据帧一样高。
    • 您能否提供一个额外的输入,以及具有 2 个输入的案例所需的结果?
    • 我澄清了原帖。数据框 1 的整个投标列成为 numpy 数组 [0] 中的一行。数据框 2 的整个投标列成为 numpy array[1] 中的一行,依此类推...
    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 2017-06-18
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多