代码之家  ›  专栏  ›  技术社区  ›  Guillaume

使用操作从Python列表创建numpy数组

  •  1
  • Guillaume  · 技术社区  · 2 年前

    我从数据库(sqlite)中提取的Python列表中的数据格式如下:

    # This is an example
    data = [(1, '12345', 1, 0, None), (1, '34567', 1, 1, None)]
    

    从这个元组列表中,我想创建一个2D numpy数组,将每个元组转换为一个数组。在这样做的同时,我还希望能够指定数据的转换。具体来说,我希望元组中索引1处的值从字符串转换为数字,如果没有,则最后一个索引处的值转换为0,否则为1。

    transformed_data = np.asarray([[1, 12345, 1, 0, 0], [1, 34567, 1, 1, 0]])
    

    我可以使用简单的for循环来实现这一点,但是我想知道是否有更“Pythony”的解决方案,无论是使用原生numpy方法还是其他方法。我正在处理一个非常大的数据库,所以复杂性很重要。提前谢谢。

    2 回复  |  直到 2 年前
        1
  •  2
  •   mozway    2 年前

    在这方面相当擅长:

    import pandas as pd
                          # set up DataFrame
    transformed_data = (pd.DataFrame(data)
                          # convert to numeric
                          .apply(pd.to_numeric, errors='coerce')
                          # replace null with 0
                          # trying to cast as integer if possible
                          .fillna(0, downcast='infer')
                          # convert to numpy array
                          .to_numpy()
                       )
    

    输出:

    array([[    1, 12345,     1,     0,     0],
           [    1, 34567,     1,     1,     0]])
    
        2
  •  1
  •   Prins    2 年前

    如果您的元组很小且大小固定,则可以使用列表理解:

    result = [(a, int(b), c, d, 0 if e is None else e) for a, b, c, d, e in data]
    

    或者稍微短一点:

    result = [(d[0], int(d[1]), *d[2:4], d[4] if d[4] else 0) for d in data]