【发布时间】:2022-01-20 14:55:32
【问题描述】:
给定一个大数据框,我如何删除两个特定字符串之间的所有内容,这里是“开始”和“结束”。昨天,我问了一个类似的问题,但删除了两个字符串(我在下面发布了我的解决方案)。现在我想看看我如何也能保留这些字符串。我一直在尝试使用 itertuples 获取下一行,但我仍然没有弄清楚如何去做。
df1:
c1 c2
0 1 1
1 2 start
2 3 3
3 4 end
4 5 5
5 6 start
6 7 end
7 8 0
删除字符串和中间内容的代码:
df = pd.DataFrame(
{'c1': [1, 2, 3, 4, 5, 6, 7, 8],
'c2': ['1', 'start', '3', 'end',
'5', 'start', 'end', 0]})
df2 = copy.copy(df)
flag = False
list_a = []
for j in df.itertuples():
if j.c2 == 'start':
flag = True
list_a.append((j))
elif j.c2 =='end':
flag = False
list_a.append((j))
elif flag:
list_a.append((j))
list_a = tuple(list_a)
to_remove_df = pd.DataFrame(list_a, columns=['index','c1','c2'])
to_remove_df = to_remove_df["c2"]
removed_df = pd.merge(df, to_remove_df, on=["c2"], how="outer", indicator=True).query('_merge != "both"').drop('_merge', 1)
输出df2:
c1 c2
0 1 1
4 5 5
7 8 0
想要的输出:
df1:
c1 c2
0 1 1
1 2 start
3 4 end
4 5 5
5 6 start
6 7 end
7 8 0
【问题讨论】:
-
Ciao Giorgio,在 start, 2,3,start,end 的情况下应该输出哪一个?
-
Ciao :) 它应该保持不变。它应该总是在最近的开始和结束之间。因此,如果它是“开始,2,3,开始,1,结束”,结果应该是“开始,2,3,开始,结束”。不过要明确一点:在我的数据框中,这不可能发生,开始后总会有结束。
-
是否总是有一个开始在结束之前和一个结束在开始之后,没有重复? (即不是结束-开始-开始-结束-开始)
-
从我目前看到的数据来看,总是开始-结束-开始-结束。没有重复,没有丢失的开始或结束。
-
那么你真的不应该循环使用vectorial solution ;)