pandas 如何用shift和condition求最大值?

cfh9epnr  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(83)

Dataframe是这样的:

Index A
0     3
1     2
2     5
3     4
4     1
5     2
6     7
7     3
8     1

字符串
我需要和移位一起去,取5块,这样最大值就在它们的中心。
测试结果:

Index A   Res
0     3    0
1     2    0
2     5    5
3     4    0
4     1    0
5     2    0
6     7    7
7     3    0
8     1    0


我如何使用pandas方法实现它?

jljoyd4f

jljoyd4f1#

您可以将rollingcenter=Truestep=5参数一起使用:

N = 5

df.loc[N//2::N, 'Res'] = (df['A'].rolling(N, center=True, min_periods=1, step=N)
                          .max().values
                         )

字符串
输出量:

Index  A  Res
0      0  3  NaN
1      1  2  NaN
2      2  5  5.0
3      3  4  NaN
4      4  1  NaN
5      5  2  NaN
6      6  7  NaN
7      7  3  7.0
8      8  1  NaN


如果你想要0 s,要么用它们(df['Res'] = 0)预先填充列,要么使用@Corralien的方法从注解中使用掩码:

df['Res'] = (df.rolling(5, center=True, min_periods=1)['A'].max()
               .where(lambda x: x == df['A'], 0).convert_dtypes()
            )


输出量:

Index  A  Res
0      0  3    0
1      1  2    0
2      2  5    5
3      3  4    0
4      4  1    0
5      5  2    0
6      6  7    7
7      7  3    0
8      8  1    0

yhuiod9q

yhuiod9q2#

要使用pandas实现这一点,您可以使用rolling方法为列'A'获取一个大小为5的滑动窗口。然后,您可以使用apply方法检查窗口的中心(即第三个元素)是否是该窗口中的最大值。如果是,则将该值设置为中心值;否则,将其设置为0。下面是如何实现的:

import pandas as pd

# Sample DataFrame
data = {
    'A': [3, 2, 5, 4, 1, 2, 7, 3, 1]
}
df = pd.DataFrame(data)

# Function to check if the center is the max value
def check_center_max(window):
    center_idx = len(window) // 2
    if window[center_idx] == max(window):
        return window[center_idx]
    return 0

# Apply the function using rolling window of size 5
df['Res'] = df['A'].rolling(window=5, center=True).apply(check_center_max, raw=True).fillna(0).astype(int)

print(df)

字符串

相关问题