Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Python 3.x_Pandas_List_Numpy - Fatal编程技术网

Python:从一个列表创建数据帧,其中每一新行从一个特定的列表索引开始

Python:从一个列表创建数据帧,其中每一新行从一个特定的列表索引开始,python,python-3.x,pandas,list,numpy,Python,Python 3.x,Pandas,List,Numpy,我有一个列表,其中“SUMMARY”元素和下一个元素之间的项数是不固定的 list = ['SUMMARY - Dec 2013', 'Person1', 'None', 'None', '10', 'SUMMARY - Dec 2013', 'Person2', '20', 'SUMMARY - Jan 2014', 'Person3', 'None'] 我试图实现的是将列表转换为一个数据帧,其中每行以“SUMMARY”元素开头 我用过 match = [] match.append([n

我有一个列表,其中“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]]
获取包含“摘要”的项的索引,我希望数据帧的每一行都从索引包含在
匹配中的相应项开始。在本例中,match有3个元素,因此我希望我的dataframe有3行和以下结构:

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

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

感谢示例数据。如果从单个系列开始,则更容易实现这一点。您可以根据是否存在“摘要”对数据行进行分组,然后使用它跨列聚合和重新分解数据

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

欢迎来到SO!如果你提供了一个高质量的答案,你会有更好的机会得到高质量的答案。@c_level I以上更新了帖子,谢谢。
pd.DataFrame([grp.tolist()代表k,grp在s.groupby中(s.str.contains('summary',case=False)。cumsum())
可能更快一些,你认为呢?@ShubhamSharma同样有效,为什么不发布答案?