假设我们有一个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
您可以将0
s替换为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