Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中提取标题,并创建一个数据框,其中标题并排列出元素_Python_List_Pandas_Dataframe - Fatal编程技术网

Python 从列表中提取标题,并创建一个数据框,其中标题并排列出元素

Python 从列表中提取标题,并创建一个数据框,其中标题并排列出元素,python,list,pandas,dataframe,Python,List,Pandas,Dataframe,在浏览完一个网站后,我得到了一个如下列表: data = ['\xa0header1', 'element1', 'element2', 'element3', '\xa0header2', 'element4', 'element5'] A B 0 element1 header1 1 element2 header1 2 element3 header1 3 element4 header2 4 e

在浏览完一个网站后,我得到了一个如下列表:

data = ['\xa0header1', 'element1', 'element2', 'element3', '\xa0header2', 'element4', 'element5']
          A         B
   0  element1   header1
   1  element2   header1
   2  element3   header1
   3  element4   header2
   4  element5   header2
等等

我想用我收集的数据创建一个熊猫数据框,如下所示:

data = ['\xa0header1', 'element1', 'element2', 'element3', '\xa0header2', 'element4', 'element5']
          A         B
   0  element1   header1
   1  element2   header1
   2  element3   header1
   3  element4   header2
   4  element5   header2
因此,基本上,我想在下一列中显示初始列表中一组元素上方的标题

考虑到标题前面的特殊字符,可以很容易地在列表中查找标题,如何做到这一点?

itertools groupby+repeat+chain 这是一个使用模块的解决方案。本质上,这些是我们需要开展的唯一业务:

  • 根据项目是否以
    \xa0
    开头对项目进行分组
  • 分组后,为列表列表中的每个列表重复标题
  • 为系列
    A
    B
    链接结果,以删除嵌套列表
  • 关键的是,这些操作已经在标准库中缓慢而高效地实现,因此不需要在纯Python中重现(尽管这本身就是一个很好的学习练习)

    完整解决方案:

    from itertools import chain, groupby, repeat
    
    chainer = chain.from_iterable
    
    data = ['\xa0header1', 'element1', 'element2', 'element3',
            '\xa0header2', 'element4', 'element5']
    
    def condition(x):
        return x.startswith('\xa0')
    
    # create list of lists for elements
    elements = [list(j) for i, j in groupby(data, key=condition) if not i]
    
    # create list of headers
    headers = [next(j) for i, j in groupby(data, key=condition) if i]
    
    # chain list of lists, and use repeat for headers
    df = pd.DataFrame({'A': list(chainer(LoL)),
                       'B': list(chainer(repeat(i, j) for i, j in \
                                 zip(headers, map(len, elements))))})
    
    print(df)
    
              A         B
    0  element1   header1
    1  element2   header1
    2  element3   header1
    3  element4   header2
    4  element5   header2
    

    另一种解决方案是使用
    collections.defaultdict
    创建一个字典,将标题映射到元素。可能比
    itertools.groupby
    更直观,只需一次

    from collections import defaultdict
    from itertools import chain, repeat
    
    chainer = chain.from_iterable
    
    data = ['\xa0header1', 'element1', 'element2', 'element3',
            '\xa0header2', 'element4', 'element5']
    
    # create dictionary of lists
    # each key a separate header; values are list of elements
    d = defaultdict(list)
    
    for item in data:
        if item.startswith('\xa0'):
            key = item.strip()
        else:
            d[key].append(item)
    
    # chain list of lists, and use repeat for headers
    df = pd.DataFrame({'A': list(chainer(d.values())),
                       'B': list(chainer(repeat(i, j) for i, j in \
                                 zip(d.keys(), map(len, d.values()))))})
    
    print(df)
    
              A        B
    0  element1  header1
    1  element2  header1
    2  element3  header1
    3  element4  header2
    4  element5  header2
    

    感谢您提供解决方案。然而,可能我不够清楚,但是标题实际上包含了\xa0egs或\xa0Plates之类的词,例如,我想提取并放入下一个colmun中,而不是枚举。