【问题标题】:List of lists to array conversion. Mixed strings and floats列表到数组转换的列表。混合字符串和浮点数
【发布时间】:2021-09-24 14:21:30
【问题描述】:

我有一个数组 (150,40),看起来像:

list_of_lists= ['name_1' 0.0123
        'name_2' 0.1234
   ... 'name_40' 0.213241
Name: 2015-03-26 16:02:42.117000, dtype: float64,

and so on, 149 more ]

我有两个问题:

所有 150 个列表的 40 个名称都相同,我如何将它们转换为数组的列,以及值(在所有 150 个列表中不同)到与每个列名称对应的行? 示例:

array= [ 'name_1', 'name_2',... 'name_40
          0.0123,    0.1234,     0.213241]

其次,Name: 2015-03-26 16:02:42.117000 实际上是一个时间戳,我需要它是 0 列,有 150 行 喜欢:

array= [ 'timestamp'     'name_1', 'name_2',... 'name_40
        16:02:42.117000   0.0123,    0.1234,     0.213241]

我不知道为什么时间戳首先是列表的名称 而且我不知道如何将其转换为数组以进行进一步处理

【问题讨论】:

    标签: python arrays list numpy


    【解决方案1】:

    关于第一个问题,你可以这样做的一种方法,严格只使用 numpy 将创建一个新的 numpy 结构化数组并为每个循环创建一组两个 (for x in list),顶部level 循环遍历数组,然后嵌套循环遍历每个数组元素,将其附加到新的结构化数组。话虽如此,这种方法会导致代码可读性差且过于复杂。

    更好的选择是使用pandas DataFrame。您应该能够像 pandas.DataFrame(mylist) 一样简单地将所有 numpy 结构化数组直接转换为 pandas,或者如果您从外部文件中读取数据,则可以直接将数据读入数据帧。

    以下方法从您的结构化数组开始(但如果使用 csv 文件或其他文件格式的其他函数,您可以将 pd.DataFrame 交换为 pd.read_csv(...) 之类的东西。

    import pandas as pd
    
    # need a list of those arrays to allow easy looping
    listofArrays = [array1, array2, ...] 
    
    # now using list comprehension, converting all those to dataframes
    listofDataFrames = [pd.DataFrame(arrayX) for arrayX in listofArrays]
    
    # now we can just use pd.Concat to put all those together
    completeSet = pd.concat(listofDataFrames)
    

    这样你就有了一个数据框,把所有东西都放在一起了。如果您严格需要它,可以将其转换回纯粹的numpy 数据结构。


    关于第二个问题,这可以使用正则表达式来解决,或者因为它是一个相当简单的字符串,使用splitjoin

    不清楚您的输入数据格式是什么,但如果我没看错的话,它还没有在数组中。所以我认为输入看起来像

    name: date1 timestamp       data: 213123 12313
    name2: date2 timestamp2     data: 21311223 313
    

    即使不同,也适用相同的原则。

    由于这相对简单,splitjoin 将是最简单的方法

    originalnamestring = "Name: 2015-03-26 16:02:42.117000"
    
    splitbyspace = originalnamestring.split(" ")
    
    name = splitbyspace[0]
    
    # and if you want to remove the : at end
    name = name[:-1]
    
    # if you want separate date and time
    
    date = splitbyspace[1]
    time = splitbyspace[2]
    
    # or combined timestamp
    
    timestamp = " ".join(splitbyspace[1:])
    

    【讨论】:

    • 谢谢!....好吧,所以 pd 和 pd 联系人创建了一个数据框,但时间戳是列名(我需要它们作为行),并且,我得到了一堆 NaN (这很奇怪,因为很多值都是小数字)
    • 那么数组是主要数据源吗(比如是否有您用来解析的文本文件来创建这些数组,或者数组是起点)?如果它是一个文本文件,那么在那里分隔名称/时间戳是最容易的。
    • 关于 NaN,数组上的数据值是什么样的? NaN 意味着缺少某些东西。 Pandas 本质上使用 numpy 作为后端来处理其数据类型,因此 anumpy 数组中的任何内容都应该与 pandas Dataframe 100% 兼容。
    • 有趣。所以,有一个巨大的数据框,我正在提取一些值,这导致我的列表列表(类型: list )使用 array = [] 和一个 for 循环来提取我感兴趣的部分,然后使用 array.apend(无论我需要什么)数据只是......数字:从小数到正数的任何地方
    • 所以,我可以转置数据帧并修复它,但是我的 NaN 该怎么办
    猜你喜欢
    • 2012-05-04
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 2017-04-29
    • 2021-12-22
    • 2023-03-25
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多