我有一个这样的数据框,
df
col1 col2
1 A
2 A
3 A
4 A
5 A
6 A
7 B
8 B
9 A
10 A
11 A
12 A
13 B
14 A
15 B
16 A
17 A
18 A
现在,如果连续B或两个B之间只有一行,则显示这些B的起始行。
所以最终输出看起来像是
col1 col2
7 B
13 B
我可以使用for循环通过比较行值来执行此操作,但是执行时间将非常长。我正在寻找任何熊猫捷径或任何其他方法来最有效地做到这一点。
答案 0 :(得分:4)
您可以先将非B
的值替换为缺失的值,然后再以限制1
进行填充-因此,后2个B
创建一个组,最后获取第一个值{{1 }}组:
B
答案 1 :(得分:0)
您可以使用移位和矢量逻辑:
a = df['col2']
mask = (a.shift(1) != a) & ((a.shift(-1) == a) | (a.shift(-2) == a)) & (a == 'B')
df = df[mask]
答案 2 :(得分:0)
cols = []
for i in range(len(df)):
if i!=0:
if df['col2'][i]==B and df['col2'][i-1]!=B:
if i>=2 and df['col2'][i-1]!=B:
cols.append(df['col1'][i])
print(df[df['col1'].isin(cols)])
输出:
col1 col2
7 B
13 B
查找B不在i-1且i-2行不具有B的索引,并从检索到的索引的数据帧中检索行。