Python 熊猫行操作-若找到startwith关键字-将行追加到前一行的末尾

Python 熊猫行操作-若找到startwith关键字-将行追加到前一行的末尾,python,pandas,dataframe,vectorization,Python,Pandas,Dataframe,Vectorization,我有一个关于文本文件处理的问题。我的文本文件打印为一列。该列的数据分散在各行中,在视觉上看起来很好&虽然有点统一,但仍然只有一列。最后,我想将找到关键字的行附加到上一行的末尾,直到数据是一个长行。然后,我将使用str.split()根据需要将节切分为列 在Excel(顶部下方的代码)中,我使用相同的文本文件,删除标题,向左对齐,并搜索关键字。找到后,Excel有一个很好的功能,称为偏移量,您可以使用此偏移量(x,y).值从活动单元格开始位置将单元格值放置或附加到任何位置。完成后,我将删除该行。这

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

在Excel(顶部下方的代码)中,我使用相同的文本文件,删除标题,向左对齐,并搜索关键字。找到后,Excel有一个很好的功能,称为偏移量,您可以使用此偏移量(x,y).值从活动单元格开始位置将单元格值放置或附加到任何位置。完成后,我将删除该行。这使我的数据库能够将数据转换成表格列格式,以便我使用

我需要的是: 下面的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
我试图用整个系列的矢量化方法来概括我的想法,但仍然坚持尝试我半熟悉的循环。如果有办法做到这一点,请给我指出正确的方向

一如既往,我感谢你的时间和知识。请让我知道你是否能帮助解决这个问题

谢谢,

Test
上使用,然后使用创建布尔掩码,然后使用此掩码的布尔索引来更新
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

IIUC,您想将以
地址
开头的行与其之前的
合并,对吗?是的,基本上,找到“Address:”的行将合并(在末尾)我希望这能回答你的问题?我想问题是我不能在row copy语句中使用静态数字。有1000多行带有“地址:”,它们都是这样统一的。Shubham,我再次感谢你。但是在我让你走之前,我需要删除concat之后的原始“地址”行。根据你在这里的经验,这能起作用吗?df.drop([m,s],inplace=True),#其中'm'是带地址的原始行,而's'是列标识符?对不起,我强调了这个项目的concat部分,没有完成最终删除原始行。@Boomer我想你可以使用
df=df[~df['Test']来过滤行。str.startswith('Address')]
或更好的
df=df[~m.shift(fill\u value=False)]
哈哈哈。。。我完全被卷进了你的变量用法(多么酷!!!)并且认为这是删除的方式。您的删除行是我在文本文件的标题中使用的行。隧道思维……我需要打开我的心扉。你难以置信的Shubham!!!一如既往地感谢!!!!快乐编码:)@Boomer