我在下面有以下数据框:
Rec Channel Value1 Value2
Pre 10 20
Pre 35 42
Event A 23 39
FF 50 75
Post A 79 11
Post B 88 69
使用以下代码:
idxall = df[df['Chan'].isin({'A', 'B'})]
for i in range(len(idxall)):
print(idxall.iloc[[i]])
目前这给我输出:
Rec Channel Value1 Value2
Event A 23 39
Post A 79 11
Post B 88 69
但是,我希望每次Channel列检测到' A'时,输出都会将所有实例拉到2行以上。或者' B'。
期望的输出:
Rec Channel Value1 Value2
Pre 10 20
Event A 23 39
FF 50 75
有人可以据此提出建议吗?
答案 0 :(得分:1)
您可以尝试这样的事情:
idx = df.loc[df.Channel.isin(['A', 'B'])].index
new_df = df.iloc[idx - 2]
>>> new_df
Rec Channel Value1 Value2
0 Pre 10 20
2 Event A 23 39
3 FF 50 75
上面代码中的 说明 idx
是Channel
列为A
或B
的索引。 df.iloc[idx - 2]
只选择在这些索引上方找到2行的行。
请注意,只要您的df
索引是连续计数,即df.index
返回类似:RangeIndex(start=0, stop=6, step=1)
的内容,此功能就会有效。如果不是这种情况,请首先使用df.reset_index(drop=True, inplace = True)
编辑:根据您的评论,您似乎只想打印行,而不是根据行创建新的数据框。在这种情况下,您可以使用基本循环格式:
idx = df.loc[df.Channel.isin(['A', 'B'])].index
for i in idx:
print(df.iloc[[i - 2]])