如何在Pandas中选择前后行条件过滤的行放在一个空df中?

okxuctiv  于 2023-01-11  发布在  其他
关注(0)|答案(1)|浏览(82)

考虑以下 Dataframe df

df = pd.DataFrame(
    {
        "col1": [0,1,2,3,4,5,6,7,8,9,10],
        "col2": ["A","B","C","D","E","F","G","H","I","J","K"],
        "col3": [1e-0,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10],
        "col4": [0,4,2,5,6,7,6,3,6,2,1]
    }
)

我希望在当前行的 col4 值大于前一行和下一行的 col4 值时选择行,并将它们存储在空帧中。
我写了下面的代码:

df1=pd.DataFrame()
for i in range(1,len(df)-1,1):
    if ( (df.iloc[i]['col4'] > df.iloc[i+1]['col4']) and (df.iloc[i]['col4'] > df.iloc[i-1]['col4']) ):
        df1=pd.concat([df1,df.iloc[i:i+1]])

我得到了预期的 Dataframe df1

col1    col2    col3    col4
1   1   B   1.000000e-01    4
5   5   F   1.000000e-05    7
8   8   I   1.000000e-08    6

但是这段代码很难看,可读性不强,...有没有最好的解决方案?

a8jjtwal

a8jjtwal1#

使用boolean indexing,通过Series.shiftSeries.gt比较下一个值和上一个值以获得更大的值,对于链式位AND,使用&

df = df[df['col4'].gt(df['col4'].shift()) & df['col4'].gt(df['col4'].shift(-1))]
print (df)
   col1 col2          col3  col4
1     1    B  1.000000e-01     4
5     5    F  1.000000e-05     7
8     8    I  1.000000e-08     6

EDIT:始终包含第一行和最后一行的解决方案:

mask = df['col4'].gt(df['col4'].shift()) & df['col4'].gt(df['col4'].shift(-1))
mask.iloc[[0, -1]] = True
df = df[mask]
print (df)
    col1 col2          col3  col4
0      0    A  1.000000e+00     0
1      1    B  1.000000e-01     4
5      5    F  1.000000e-05     7
8      8    I  1.000000e-08     6
10    10    K  1.000000e-10     1

相关问题