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
链接结果,以删除嵌套列表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中,而不是枚举。