python - 从列表中提取标题并创建一个带有并排标题的 DataFrame 以列出元素

标签 python list pandas dataframe

抓取网站后,我最终得到了一个如下所示的列表:

data = ['\xa0header1', 'element1', 'element2', 'element3', '\xa0header2', 'element4', 'element5']

等等。

我想用我抓取的数据创建一个 Pandas 数据框,如下所示:

          A         B
   0  element1   header1
   1  element2   header1
   2  element3   header1
   3  element4   header2
   4  element5   header2

所以,基本上,我想在下一列中显示初始列表的一组元素上方的标题。

考虑到标题前面的特殊字符可以很容易地在列表中查找它们,该怎么办?

最佳答案

itertools groupby +重复+链

这是一种使用 itertools 的解决方案模块。本质上,这些是我们需要进行的唯一操作:

  1. 根据项目是否以 \xa0 开头对项目进行分组
  2. 分组后,为列表列表中的每个列表重复标题。
  3. AB 系列的链接结果以删除嵌套列表。

至关重要的是,这些操作已经在标准库中延迟且高效地实现,因此无需在纯 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

关于python - 从列表中提取标题并创建一个带有并排标题的 DataFrame 以列出元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50778174/

相关文章:

python - 如何在异步中并发运行任务?

python - 从列表中删除点对象 : ValueError: list. remove(x): x not in list

python - 如何使用 MultiIndex 重新索引?

python - 将 Python 应用程序作为 debian 包分发,但作为服务分发

python - scikit-learn:FeatureUnion 包含手工制作的功能

python - Pyspark根据对应列中满足特定条件的多列的最大值创建列

Python:使用正则表达式检查列表,填充空白

java - Vector 与 SynchronizedList 性能

python - 将具有重复键的 Pandas DataFrame 转换为字典

python - 使用 pandas/python 连接两个 csv 文件,不重复