Python 数据是包含标题和小节的列,如何拆分它?

Python 数据是包含标题和小节的列,如何拆分它?,python,pandas,Python,Pandas,我有一个字符串列表,如下所示: 'A[title]' 'a' 'b' 'c' 'B[title]' 'd' 'C[title]' 'e' 'f' ... 'A[title]' ,'a' 'A[title]' ,'b' 'A[title]' ,'c' 'B[title]' ,'d' 'C[title]' ,'e' 'C[title]' ,'f' ... data=pd.Series(data) newd = [] for i in data.index: if '[' not in

我有一个字符串列表,如下所示:

'A[title]'
'a'
'b'
'c'
'B[title]'
'd'
'C[title]'
'e'
'f'
...
'A[title]' ,'a'
'A[title]' ,'b'
'A[title]' ,'c'
'B[title]' ,'d'
'C[title]' ,'e'
'C[title]' ,'f'
...
data=pd.Series(data)

newd = []
for i in data.index:
    if '[' not in data[i]:
        current_title = data[i]
    else:
        newd.append([current_title,data[i]])
其中每个块由标有“title”的标题分隔。 我需要将这些块分开,并将其格式化如下:

'A[title]'
'a'
'b'
'c'
'B[title]'
'd'
'C[title]'
'e'
'f'
...
'A[title]' ,'a'
'A[title]' ,'b'
'A[title]' ,'c'
'B[title]' ,'d'
'C[title]' ,'e'
'C[title]' ,'f'
...
data=pd.Series(data)

newd = []
for i in data.index:
    if '[' not in data[i]:
        current_title = data[i]
    else:
        newd.append([current_title,data[i]])
我目前正在使用for循环来完成这项工作,我的代码如下所示:

'A[title]'
'a'
'b'
'c'
'B[title]'
'd'
'C[title]'
'e'
'f'
...
'A[title]' ,'a'
'A[title]' ,'b'
'A[title]' ,'c'
'B[title]' ,'d'
'C[title]' ,'e'
'C[title]' ,'f'
...
data=pd.Series(data)

newd = []
for i in data.index:
    if '[' not in data[i]:
        current_title = data[i]
    else:
        newd.append([current_title,data[i]])
这是所需的格式,但实际上我正在尝试避免使用for循环。
那么,有没有一种方法可以通过内置的pandas函数来实现呢?

您可以通过
str.contains
ffill

data=data.to_frame('ori')
data['title']=data.ori[data.ori.str.contains('title')]
data=data.ffill().loc[lambda x : x.ori!=x.title]
data
Out[499]: 
  ori     title
1   a  A[title]
2   b  A[title]
3   c  A[title]
5   d  B[title]
7   e  C[title]
8   f  C[title]

对于纯Python解决方案,您可以使用:

解释

  • 根据字符串是否以
    [title]
    结尾进行分组
  • 将结果提取为列表,以便稍后切片
  • 通过使用
    zip
    的嵌套列表,将奇数元素提取为标题,将偶数元素提取为名称

  • OP指定他们希望避免使用for循环,而只使用基于pandas的逻辑。列表理解本质上不是伪装成同一件事吗?@BrianJoseph,Pandas
    str
    方法内部不使用
    for
    循环吗?值得注意的是,Pandas中的
    str
    方法的实现效率低于list comp中的常规Python循环。当然,我完全同意Pandas方法在这种情况下可能较慢。我只是觉得OP想要在他们的解决方案中避免for循环,不是为了效率,而是为了学习熊猫语言。OP已经明确表示,他们可以用迭代/循环来解决问题,但不能用pandas语法