Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在df上迭代并参考下一行_Python_Pandas_Iteration - Fatal编程技术网

Python在df上迭代并参考下一行

Python在df上迭代并参考下一行,python,pandas,iteration,Python,Pandas,Iteration,我有一个包含两列的数据框架——Col1和Col2。我希望遍历它并仅返回遵循以下模式的值: 如果A后跟B,则返回AB,否则不返回任何内容。我想基本上去掉所有的A,而不是紧接着的B。请注意,在我的真实示例中,B的前面总是有A df = pd.DataFrame({"Col1": ['A', 'B', 'A', 'A', 'B'], "Col2": [11, 22, 33, 44, 55]}) Col1 Col2 0

我有一个包含两列的数据框架——Col1和Col2。我希望遍历它并仅返回遵循以下模式的值:

如果A后跟B,则返回AB,否则不返回任何内容。我想基本上去掉所有的A,而不是紧接着的B。请注意,在我的真实示例中,B的前面总是有A

df = pd.DataFrame({"Col1": ['A', 'B', 'A', 'A', 'B'],
                   "Col2": [11, 22, 33, 44, 55]})

  Col1  Col2
0    A    11
1    B    22
2    A    33
3    A    44
4    B    55
我想出了这个密码:

for index, row in df.iterrows():
    if row['Col1'] == 'A':
        if row.shift(1)['Col1'] == 'B':
            print(row)
            print(row.shift(1))
        else:
            continue
    else:
        continue
我现在只做了“打印功能”,看看是否正确的条目打印,但是如果有人能帮助我用这些行创建一个新的DF,我会很高兴的

上面的代码不返回任何内容,但也不返回任何错误

编辑:所需输出示例

  Col1  Col2
0    A    11
1    B    22
3    A    44
4    B    55

你能添加一个你想要的输出的例子吗

另外,在熊猫数据帧中创建“for”循环通常被认为是不好的做法(也需要很多时间!)。我相信你的问题的答案就在这篇文章中:


让我们创建一个布尔掩码,其中
eq
+
shift
表示
a
后跟
B
的情况,然后使用此掩码过滤数据帧:

m1 = df['Col1'].eq('B') & df['Col1'].shift().eq('A')
m2 = df['Col1'].eq('A') & df['Col1'].shift(-1).eq('B')
df = df[m1 | m2]


我的朋友帮助我找到了一个解决方案,所以我为那些遇到这个问题的人分享

df["Col3"] = df["Col1"].shift(-1)
df["Col4"] = df["Col1"].shift(1)

df_new = df[((df["Col1"] == "A") & (df["Col3"] == "B")) | ((df["Col1"] == "B") & (df["Col4"] == "A"))]
df_new = df_new[["Col1", "Col2"]]

df_new

谢谢你的评论,我在我的原始帖子中加入了一个例子!我已经读过你链接的帖子了,但我似乎找不到任何有用的东西。所有方法(应用、矢量化)似乎都无法针对我的情况引用下一行。我试过申请,但没有成功。谢谢,这比我下面列出的朋友代码还要好@从技术上讲,他们是一样的。这个更简洁;)
df["Col3"] = df["Col1"].shift(-1)
df["Col4"] = df["Col1"].shift(1)

df_new = df[((df["Col1"] == "A") & (df["Col3"] == "B")) | ((df["Col1"] == "B") & (df["Col4"] == "A"))]
df_new = df_new[["Col1", "Col2"]]

df_new