Python在df上迭代并参考下一行
我有一个包含两列的数据框架——Col1和Col2。我希望遍历它并仅返回遵循以下模式的值: 如果A后跟B,则返回AB,否则不返回任何内容。我想基本上去掉所有的A,而不是紧接着的B。请注意,在我的真实示例中,B的前面总是有APython在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
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