Pandas:在数据框中位于两行之间的所有行中设置值?



假设我们有一个pandas数据框架,如下所示:

df = pd.DataFrame({"Basis": [300, 1500, 400, 260, 50,-10],"Weights":[0,-1,0,0,0,0]})
print(df)
Basis  Weights
0    300        0
1   1500       -1
2    400        0
3    260        0
4     50        0
5    -10        0

所以我发现了如何根据同一行的另一列中的值在X行中设置X列的值。所以在这个数据框中我得到我可以将所有的权值设为-1其中Basis>1000

df.loc[df['Basis'] > 1000, 'Weights'] = -1

我想做的是:在这个格式的大df中,取之间的所有行一行,其中有一个权重为-1和后一行,其中基<= 0,并设置它们的权重值为-1(所以在图像的情况下,我想设置行1-4的权重值为-1,我必须弄清楚如何做到这一点,而不循环通过整个数据框(必须使用一个非常大的数据集)。

期望的输出将是:

Basis  Weights
0    300        0
1   1500       -1
2    400       -1
3    260       -1
4     50       -1
5    -10        0

是否有一种优雅的方法来避免循环遍历整个df?例如,如果basis>=0,则用某种快速的方法实现权重等于前一个权重的条件

如果权重中只有>0或-1值,则可以从负基开始设置组,并获得cummin权重:

group = df['Basis'].lt(0).cumsum()
df['Weights'] = df.groupby(group)['Weights'].cummin()

如果您有任意值,这有点复杂,您首先需要屏蔽非-1值,每组ffill,然后恢复其他值:

group = df['Basis'].lt(0).cumsum()
df['Weights'] = (df['Weights']
.where(df['Weights'].eq(-1))
.groupby(group).ffill()
.fillna(df['Weights'], downcast='infer')
)

输出:

Basis  Weights
0    300        0
1   1500       -1
2    400       -1
3    260       -1
4     50       -1
5    -10        0

您可以将0s替换为nan,然后是fillna-

df.loc[(df['Basis'] > 0) & (df['Weights'] >= 0), 'Weights'] = np.nan
df = df.fillna(method='ffill').fillna(0) 

Basis  Weights
0    300      0.0
1   1500     -1.0
2    400     -1.0
3    260     -1.0
4     50     -1.0
5    -10      0.0

最新更新