将第一行连续的特定值保留在熊猫数据框中?

时间:2019-12-23 10:30:28

标签: python pandas dataframe

我有一个这样的数据框,

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循环通过比较行值来执行此操作,但是执行时间将非常长。我正在寻找任何熊猫捷径或任何其他方法来最有效地做到这一点。

3 个答案:

答案 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的索引,并从检索到的索引的数据帧中检索行。