pandas 行操作 - 如果找到 startwith 关键字 - 将行附加到上一行的末尾

pandas row manipulation - If startwith keyword found - append row to end of previous row

我有一个关于文本文件处理的问题。我的文本文件打印为一栏。该列的数据分散在各行中,视觉上看起来很棒而且有些统一,但仍然只有一列。最后,我想将找到关键字的行附加到前一行的末尾,直到数据是一长行。然后我将使用 str.split() 根据需要将部分分成几列。

在 Excel(代码 below-Top)中,我使用了相同的文本文件并删除了 headers,左对齐,然后搜索关键字。找到后,Excel 有一个很好的功能,称为 offset,您可以使用此 offset(x,y).value 从 active-cell 起始位置基本上在任何地方放置或附加单元格值。完成后,我将删除该行。这使我能够将数据转换为我可以使用的表格列格式。

我需要什么: 下面的 Python 代码将循环遍历每一行以查找关键字 'Address:'。这部分代码有效。找到关键字后,下一行应将该行附加到上一行的末尾。这就是我的问题所在。我找不到将活动行号放入变量的方法,因此我可以使用 [index] 代替活动行的单词。或前一行的 [index-1]。

Excel 类似任务代码

Do
    Set Rng = WorkRng.Find("Address", LookIn:=xlValues)
    If Not Rng Is Nothing Then
        Rng.Offset(-1, 2).Value = Rng.Value
        Rng.Value = ""
    End If
Loop While Not Rng Is Nothing

Python 等价

import pandas as pd
from pandas import DataFrame, Series


file = {'Test': ['Last Name: Nobody','First Name: Tommy','Address: 1234 West Juniper St.','Fav 
Toy', 'Notes','Time Slot' ] }

df = pd.DataFrame(file)

                             Test
0               Last Name: Nobody
1               First Name: Tommy
2  Address: 1234 West Juniper St.
3                         Fav Toy
4                           Notes
5                       Time Slot

我试过以下方法:

for line in df.Test:
    if line.startswith('Address:'):
        df.loc[[index-1],:].values = df.loc[index-1].values + ' ' + df.loc[index].values        
            Line above does not work with index statement
    else:
        pass


# df.loc[[1],:] = df.loc[1].values + ' ' + df.loc[2].values  # copies row 2 at the end of row 1, 
                                                             # works with static row numbers only
# df.drop([2,0], inplace=True)  # Deletes row from df

预期输出:

                                               Test
0                                 Last Name: Nobody
1  First Name: Tommy Address: 1234 West Juniper St.
2                    Address: 1234 West Juniper St.
3                                           Fav Toy
4                                             Notes
5                                         Time Slot

我正在尝试全神贯注于整个系列矢量化方法,但仍然坚持尝试我不太熟悉的循环。如果有办法实现这一目标,请指出正确的方向。

一如既往,我感谢你的时间和知识。如果您能帮助解决这个问题,请告诉我。

谢谢,

使用 Series.shift on Test then use Series.str.startswith 创建一个布尔掩码,然后使用带有此掩码的布尔索引来更新 Test 列中的值:

s = df['Test'].shift(-1)
m = s.str.startswith('Address', na=False)
df.loc[m, 'Test'] += (' ' + s[m])

结果:

                                              Test
0                                 Last Name: Nobody
1  First Name: Tommy Address: 1234 West Juniper St.
2                    Address: 1234 West Juniper St.
3                                           Fav Toy
4                                             Notes
5                                         Time Slot