Python:从每个新行从特定列表索引开始的列表创建数据框

Posted

技术标签:

【中文标题】Python:从每个新行从特定列表索引开始的列表创建数据框【英文标题】:Python: Create dataframe from a list where each new row starts at a specific list index 【发布时间】:2020-11-03 14:55:47 【问题描述】:

我有一个列表,其中“SUMMARY”元素和下一个元素之间的项目数不固定

list = ['SUMMARY - Dec 2013', 'Person1', 'None', 'None', '10', 'SUMMARY - Dec 2013', 'Person2', '20', 'SUMMARY - Jan 2014', 'Person3', 'None']

我想要实现的是将列表转换为数据框,其中每一行都以“SUMMARY”元素开头

我用过

match = []
match.append([n for n, l in enumerate(list) if l.startswith('SUMMARY')])

使用输出[[0, 5, 8]] 来获取包含“SUMMARY”的项目的索引,并且我希望我的数据框的每一行都从其索引包含在match 中的相应项目开始。在这种情况下,匹配有 3 个元素,所以我希望我的数据框有 3 行和以下结构:

'SUMMARY - Dec 2013', 'Person1', 'None', 'None', '10'
'SUMMARY - Dec 2013', 'Person2', '20',   NA,    NA
'SUMMARY - Jan 2014', 'Person3', 'None', NA,    NA

基本上,当特定行的项目数小于最大列数时,其余的将被 NA/NaN 填充。

【问题讨论】:

【参考方案1】:

感谢您提供示例数据。如果您从单个系列开始,则更容易解决此问题。您可以根据是否存在“摘要”对数据行进行分组,然后使用它来聚合和重新展开跨列的数据。

s = pd.Series(your_list)
pd.DataFrame(s.groupby(s.str.contains('summary', case=False).cumsum())
              .agg(list)
              .tolist())                                                   

                    0        1     2     3     4
0  SUMMARY - Dec 2013  Person1  None  None    10
1  SUMMARY - Dec 2013  Person2    20  None  None
2  SUMMARY - Jan 2014  Person3  None  None  None

感谢@Shubham Sharma 关于迭代组的建议:

pd.DataFrame([g.tolist() for k, g in s.groupby(
    s.str.contains('summary', case=False).cumsum())])

                    0        1     2     3     4
0  SUMMARY - Dec 2013  Person1  None  None    10
1  SUMMARY - Dec 2013  Person2    20  None  None
2  SUMMARY - Jan 2014  Person3  None  None  None

【讨论】:

pd.DataFrame([grp.tolist() for k, grp in s.groupby(s.str.contains('summary', case=False).cumsum()) 可能会更快,你觉得呢? @ShubhamSharma 也可以,为什么不发布答案?

以上是关于Python:从每个新行从特定列表索引开始的列表创建数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将从特定索引开始的列表与python中的另一个索引相加

Python数据类型之列表

从具有特定索引的 python 列表中挑选项目

如何从python列表中任何特定索引处的句子中提取特定字符串?

如何从包含Python3中特定索引和列的列表的dict创建Pandas DataFrame?

昨天休息了一天,今天补上。列表学习