问题描述
我对文本文件处理有疑问。我的文本文件打印为一列。该列中的数据分散在各行中,视觉上看起来不错,有些统一,但是仍然只有一列。最终,我想将在其中找到关键字的行追加到前一行的末尾,直到数据为一长行为止。然后,我将根据需要使用str.split()将节切成几列。
在Excel(代码自上而下)中,我采用了相同的文本文件,并删除了标题,并向左对齐,并搜索了关键字。找到后,Excel具有一个不错的功能,称为偏移量,您可以使用从活动单元格开始位置开始的该offset(x,y).value基本上在任何位置放置或附加单元格值。完成后,我将删除该行。这使我可以将数据转换为可以使用的表格列格式。
我需要什么: 下面的Python代码将在每一行中循环查找关键字“地址:”。这部分代码有效。找到关键字后,下一行应将行追加到上一行的末尾。这是我的问题所在。我找不到将活动行号转换为变量的方法,因此可以代替活动行的单词[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
上使用Series.shift
,然后使用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