pandas 根据Python中dataframe中的相邻行更改行

iswrvxsc  于 2023-08-01  发布在  Python
关注(0)|答案(1)|浏览(97)

我有一个df,它只包含0和0。我想用这样的方式改变df:我用滑动窗口4通过列和所有行移动。例如,第一个窗口是df.iloc [:,0:4],如果这个窗口中没有任何1,我们就不会改变这个窗口中的任何东西。但如果我们在这个窗口中有1,只有1的行会更改为1。例如,对于窗口1,id=2具有1,因此对于行id=2,列0:4更改为1,对于行id=3也相同。我在这里提供了一个df,以及所需的输出。
我可以通过在df上循环来实现这一点,但是,我的df有数百万行,而且我的低效方法需要时间。你能帮我一下吗谢谢。
下面是DF:

import pandas as pd

df = pd.DataFrame()
df['Ids'] = [1, 2, 3]
df['a1'] = [0, 0, 0]
df['a2'] = [0, 0, 1]
df['a3'] = [0, 1, 1]
df['a4'] = [0, 1, 1]
df['a5'] = [0, 0, 0]
df['a6'] = [0, 0, 1]
df['a7'] = [1, 0, 1]
df['a8'] = [1, 0, 1]
df['a9'] = [0, 0, 0]
df['a10'] = [0, 0, 0]
df['a11'] = [0, 0, 0]
df['a12'] = [0, 0, 0]

字符串
下面是输出:

Ids  a1  a2  a3  a4  a5  a6  a7  a8  a9  a10  a11  a12
0    1   0   0   0   0   1   1   1   1   0    0    0    0
1    2   1   1   1   1   0   0   0   0   0    0    0    0
2    3   1   1   1   1   1   1   1   1   0    0    0    0

sg24os4d

sg24os4d1#

在临时设置Ids作为索引后,在反向数组上使用rolling.max

out = (df.set_index('Ids', append=True).loc[:, ::-1]
         .rolling(3, axis=1, min_periods=1).max()
         .astype(int).reset_index('Ids')[df.columns]
      )

字符串
或者使用scipy.signal.convolve2d的2D卷积:

from scipy.signal import convolve2d

N = 3
cols = df.columns[1:]

df[cols] = convolve2d(df[cols], np.r_[np.ones(N, dtype=bool),
                                      np.zeros(N-1, dtype=bool)].reshape(1, -1),
                      mode='same').astype(bool).astype(int)


输出量:

Ids  a1  a2  a3  a4  a5  a6  a7  a8  a9  a10  a11  a12
0    1   0   0   0   0   1   1   1   1   0    0    0    0
1    2   1   1   1   1   0   0   0   0   0    0    0    0
2    3   1   1   1   1   1   1   1   1   0    0    0    0

相关问题