Python 将嵌套列表转换为具有列名的数据帧

Python 将嵌套列表转换为具有列名的数据帧,python,pandas,data-processing,Python,Pandas,Data Processing,我有一个嵌套列表,看起来像这样 features = [['0:0.084556', '1:0.138594', '2:0.094304\n'], ['0:0.101468', '4:0.138594', '5:0.377215\n'], ['0:0.135290', '2:0.277187', '3:0.141456\n'] ] 嵌套列表中的每个列表都是以逗号分隔的行。“:”的左侧是列名,右侧是行值 我想将其转换为熊猫数据帧,如下所示: f_0000 | f_0001 |

我有一个嵌套列表,看起来像这样

features = 
[['0:0.084556', '1:0.138594', '2:0.094304\n'],
 ['0:0.101468', '4:0.138594', '5:0.377215\n'],
 ['0:0.135290', '2:0.277187', '3:0.141456\n']
]
嵌套列表中的每个列表都是以逗号分隔的行。“:”的左侧是列名,右侧是行值

我想将其转换为熊猫数据帧,如下所示:

  f_0000  |  f_0001  |  f_0002  |  f_0003  |  f_0004  | f_0005
---------------------------------------------------------------
 0.084556 | 0.138594 | 0.094304 | 0.000000 | 0.000000 | 0.000000
 0.101468 | 0.000000 | 0.000000 | 0.000000 | 0.138594 | 0.377215
 0.135290 | 0.000000 | 0.277187 | 0.141456 | 0.000000 | 0.000000
有人能帮我解决这个问题吗

原始DF(它在pd.read_剪贴板上的格式不正确,但是…)

试试这个:

df = pd.DataFrame(data, columns = ['Column name 1'], ['column name 2'])

我认为对于循环,简单的方法仍然是

  • 首先,从给定的
    功能中选择所有键

  • 对于所有元素,我们使用并提取第一个元素
  • 然后,因为我们只需要唯一的密钥,所以我们使用。然后,我们将其转换回
    列表
    ,并使用
    排序
    对键进行排序(如果需要,可以提供一些详细信息)
  • 第一部分总结如下:

    keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
    
  • 从上述键创建一个空的
    dict
    ,并用空列表初始化所有键:
  • 迭代所有功能:

  • 将访问的所有关键功能保存在
    seen
    变量中
  • 添加所有功能键和值
  • 使用不在当前
    功能中的键完成数据
  • 最后,使用默认构造函数[
    pd.dataframe()
    ])从out dict创建数据帧

  • 使用名称和字符串格式()正确设置列的格式。有一些很好的解释


  • 说得够多了,这里是完整的代码+插图:

    features = [["0:0.084556", "1:0.138594", "2:0.094304"],
        ["0:0.101468", "4:0.138594", "5:0.377215"],
        ["0:0.135290", "2:0.277187", "3:0.141456"]
        ]
    
    # Step 1
    keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
    print(keys)
    # ['0', '1', '2', '3', '4', '5']
    
    # Step 2
    data = {k:[] for k in keys}
    print(data)
    # {'0': [], '1': [], '2': [], '3': [], '4': [], '5': []}
    
    # Step 3
    for sub in features:
        # Step 3.1
        seen = []
        # Step 3.2
        for l in sub:
            k2, v = l.split(":")        # Get key and value
            data[k2].append(float(v))   # Append current value to data
            seen.append(k2)             # Set the key as seen
    
        # Step 3.3
        for k in keys:                  # For all data keys
            if k not in seen:           # If not seen
                data[k].append(0)       # Add 0
    
    print(data)
    # {'0': [0.084556, 0.101468, 0.13529], 
    #     '1': [0.138594, 0, 0], 
    #     '2': [0.094304, 0,0.277187],
    #     '3': [0, 0, 0.141456],
    #     '4': [0, 0.138594, 0],
    #     '5': [0, 0.377215, 0]
    # }
    
    # Step 4
    df = pd.DataFrame(data)
    print(df)
    #           0         1         2         3         4         5
    # 0  0.084556  0.138594  0.094304  0.000000  0.000000  0.000000
    # 1  0.101468  0.000000  0.000000  0.000000  0.138594  0.377215
    # 2  0.135290  0.000000  0.277187  0.141456  0.000000  0.000000
    
    # Step 5
    df.columns = ["f_{:04d}".format(int(val)) for val in df.columns]
    print(df)
    #      f_0000    f_0001    f_0002    f_0003    f_0004    f_0005
    # 0  0.084556  0.138594  0.094304  0.000000  0.000000  0.000000
    # 1  0.101468  0.000000  0.000000  0.000000  0.138594  0.377215
    # 2  0.135290  0.000000  0.277187  0.141456  0.000000  0.000000
    

    这些字符串在列表中吗?或者这是文本文件中的某个“列表”?这最初是一个数据框,列表中的所有项目都作为一列。我做了
    list(train['features'].str.split(“”))
    将其转换为嵌套列表。features=[[0:0.08456,1:0.138594,2:0.094304\n],[0:0.101468,4:0.138594,5:0.377215\n],[0:0.135290,2:0.277187,3:0.141456\n]]这不是一个正确的列表。您能发送实际的列表吗?@SachinGupta对此表示歉意。您能添加原始数据帧的样本吗?从那里开始可能会更快。做得好,非常干净的方法!我试图做一些类似的事情,但我的python技能再次让我失望!这太棒了!如果我有一个数字列,比如“f_1000”,这些列将不再有序,不是吗?你怎么会这么想?如果我有5000个特征,则在步骤1中对列进行排序。列f_0000将首先是f_0001,然后是f_0010。应该是f_0000列,然后是f_0001列,然后是f_0002列。不过,我大概能理解这一部分。谢谢伟大的另一种方法是转换为数字,排序,然后返回字符串(如果需要的话):-)请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。
    data = {k:[] for k in keys}
    
    features = [["0:0.084556", "1:0.138594", "2:0.094304"],
        ["0:0.101468", "4:0.138594", "5:0.377215"],
        ["0:0.135290", "2:0.277187", "3:0.141456"]
        ]
    
    # Step 1
    keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
    print(keys)
    # ['0', '1', '2', '3', '4', '5']
    
    # Step 2
    data = {k:[] for k in keys}
    print(data)
    # {'0': [], '1': [], '2': [], '3': [], '4': [], '5': []}
    
    # Step 3
    for sub in features:
        # Step 3.1
        seen = []
        # Step 3.2
        for l in sub:
            k2, v = l.split(":")        # Get key and value
            data[k2].append(float(v))   # Append current value to data
            seen.append(k2)             # Set the key as seen
    
        # Step 3.3
        for k in keys:                  # For all data keys
            if k not in seen:           # If not seen
                data[k].append(0)       # Add 0
    
    print(data)
    # {'0': [0.084556, 0.101468, 0.13529], 
    #     '1': [0.138594, 0, 0], 
    #     '2': [0.094304, 0,0.277187],
    #     '3': [0, 0, 0.141456],
    #     '4': [0, 0.138594, 0],
    #     '5': [0, 0.377215, 0]
    # }
    
    # Step 4
    df = pd.DataFrame(data)
    print(df)
    #           0         1         2         3         4         5
    # 0  0.084556  0.138594  0.094304  0.000000  0.000000  0.000000
    # 1  0.101468  0.000000  0.000000  0.000000  0.138594  0.377215
    # 2  0.135290  0.000000  0.277187  0.141456  0.000000  0.000000
    
    # Step 5
    df.columns = ["f_{:04d}".format(int(val)) for val in df.columns]
    print(df)
    #      f_0000    f_0001    f_0002    f_0003    f_0004    f_0005
    # 0  0.084556  0.138594  0.094304  0.000000  0.000000  0.000000
    # 1  0.101468  0.000000  0.000000  0.000000  0.138594  0.377215
    # 2  0.135290  0.000000  0.277187  0.141456  0.000000  0.000000