pandas 根据列中的条件选择行中的数据

a2mppw5e  于 2022-12-16  发布在  其他
关注(0)|答案(4)|浏览(122)

我有两列的xls文件,我想在Pandas读取。然后从创建的 Dataframe ,我想输出另一个xls文件的基础上,在列结果的标准。
如果结果列中的数据等于失败,则输出xls文件应包含上1行和下1行的数据以及失败行本身的数据。
所示输入和输出示例
输入:

Team    result
1   pass
2   pass
3   fail
4   pass
5   pass
6   pass
7   fail
8   pass
9   pass
10  pass
11  pass
12  pass
13  pass
14  fail
15  pass

输出:

Team    result
2   pass
3   fail
4   pass
6   pass
7   fail
8   pass
13  pass
14  fail
15  pass
hrysbysz

hrysbysz1#

在从等于目标('fail')派生的布尔级数上使用居中的rolling和,并执行布尔索引:

df[df['result'].eq('fail').rolling(3, center=True, min_periods=1).max().eq(1)]
  • 注意。这样可以轻松选择下方/后方的更多行。例如,要获取上方2+下方2,请使用5(一般情况下为2n+1)作为滚动窗口。

输出:

Team result
1      2   pass
2      3   fail
3      4   pass
5      6   pass
6      7   fail
7      8   pass
12    13   pass
13    14   fail
14    15   pass
5vf7fwbs

5vf7fwbs2#

shift在这里是您的朋友。如果其中一个值是fail,您必须上下移动result列,并保留该行:

x = (df['result'] == 'fail') | (df['result'].shift() == 'fail') | (
     df['result'].shift(-1) == 'fail')
print(df[x])

按预期给出:

Team result
1      2   pass
2      3   fail
3      4   pass
5      6   pass
6      7   fail
7      8   pass
12    13   pass
13    14   fail
14    15   pass
czq61nw1

czq61nw13#

你可以在df['result'] == 'fail'的索引中加上或减去1,但是如果最后一行有fail的话,也会得到KeyError,所以我们还需要使用index.intersection来达到有效的索引:

all_indexes = np.ravel([df[df['result'] == 'fail'].index + i for i in range(-1, 2)])
valid_indexes = df.index.intersection(all_indexes)
df.loc[valid_indexes]

输出:

result
1   pass
2   fail
3   pass
5   pass
6   fail
7   pass
12  pass
13  fail
14  pass
3z6pesqy

3z6pesqy4#

def function1(dd:pd.DataFrame):
    if dd.iloc[1,1]=='fail':
        df1.loc[dd.index,'col1']=True
    return 0

pd.Series(df1.rolling(3,center=True)).apply(function1)
df1.loc[lambda dd:dd.col1==True,:'result']

  Team result
1      2   pass
2      3   fail
3      4   pass
5      6   pass
6      7   fail
7      8   pass
12    13   pass
13    14   fail
14    15   pass

相关问题