抓取网站后,我最终得到了一个如下所示的列表:
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
的解决方案模块。本质上,这些是我们需要进行的唯一操作:
- 根据项目是否以
\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
关于python - 从列表中提取标题并创建一个带有并排标题的 DataFrame 以列出元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50778174/