从具有多个值(〜500 000)的pandas数据帧中创建数组的最快方法

时间:2019-05-29 13:57:03

标签: python pandas numpy dataframe data-analysis

我有一个数据框,其中包含一列vector,其中包含约50万行数组向量。我想做的是将该列的内容卸载到二维数组中,但是我不知道这样做的最快方法。

这是我要获取的数组的格式([1, 2], [3, 4][5, 6]是数据框中包含的数组):

array([[1, 2],
       [3, 4],
       [5, 6]])

我尝试了to_numpyas_matrix.values,但是它给了我一个1D数组,这不是我想要的:

array([array([1, 2]),
       array([3, 4]),
       array([5, 6])])

给我想要的结果的唯一方法是np.asarray()np.array(),但是在我看来,它们花费了太多时间。

我想要的是与我使用numpy数组方法(vector1,2和8)获得的数组相同的数组,但是如果可能的话会更快,因为当我们拥有大量数据时会花费太多时间。

谢谢您的帮助!

edit :这是我执行以下操作的函数:它接受一个数据框参数,该数据框包含两列:id和vectors,它们是一系列数组对象。

 id      vectors
  1      array([1,2,3], dtype='float32')
  2      array([3,4,5], dtype='float32')
  3      array([6,7,8], dtype='float32')

[11530行x 2列]

我要使用此功能要做的是将列表ID的内容快速而轻松地卸载到列表中,并将列向量的内容加载到数组中。所以我想要一个二维数组的数组矢量。

def filter_df(df, request):

start = time.time()
filtered_df = df
ids = filtered_df['id'].tolist()

filtered_df_vectors = filtered_df['vectors'].tolist()

vectors9 = np.array(filtered_df['vectors'].tolist())

vectors1 = np.asarray(filtered_df_vectors)

vectors2 = np.array([f for f in filtered_df_vectors],dtype=np.float32)

vectors3 = filtered_df['vectors'].as_matrix()

vectors4 = filtered_df['vectors'].to_numpy()

vectors5 = filtered_df['vectors'].values

vectors6 = filtered_df.iloc[:,-1].values

vectors8 = np.array(filtered_df['vectors'].values.tolist())

vectors9 = np.array(filtered_df['vectors'].tolist())


filter_duration= time.time()-start
logger.info(f"duration: {filter_duration}s")
return ids,vectors2,filter_duration

我无法复制并粘贴将其返回给我的结果数组的确切输出,因为它对您不可读,因此我只展示通过多种测试方法获得的两种数组。

对于使用numpy方法的矢量1、2、8和9,我获得的格式是我正在寻找的格式,但是需要花费很多时间(大约0.7秒,对于我的情况来说太慢了) )。我不会复制粘贴获得的确切数组,因为它对您不可读。只知道[1,2,3]代表我得到的是这

array([[1,2,3],
      [4,5,6],
      [7,8,9]], dtype=float32)

ndim : 2
dtype('float32')
shape : (11530, 300)
size : 3459000

对于向量3、4、5和6,其中我不使用像熊猫to_numpy或as_matrix这样的numpy方法,速度很快(〜0.05秒),但以相同的形式返回给我这样格式的数组:

array([array([1,2,3], dtype=float32),
       array([4,5,6], dtype=float32),
       array([7,8,9], dtype=float32)], dtype=object)

ndim : 1
dtype('O')
shape : (11530,)
size : 11530

我不明白为什么它不能像numpy方法那样给我同样的数组。

0 个答案:

没有答案