Python 根据列值将分数填充到行中

Python 根据列值将分数填充到行中,python,pandas,Python,Pandas,我有一个这样的数据帧 Example1: score_df ======== rid score Flag 1 5 y 1 6 n 1 7 y 1 8 n score_df ======== rid score Flag 1 5 n 1 6 y 1 6 n 1 6 n 当Flag='y'首先出现时,我需要将分数复制到其余行。在本例中,当分数为5时,第一行上出现flag=y。我会将

我有一个这样的数据帧

Example1:

score_df
========
rid score Flag
1    5     y
1    6     n
1    7     y
1    8     n
score_df
========
rid score Flag
1    5     n
1    6     y
1    6     n
1    6     n
当Flag='y'首先出现时,我需要将分数复制到其余行。在本例中,当分数为5时,第一行上出现flag=y。我会将分数5复制到剩余的行中。输出将如下所示

score_df
========
rid score Flag
1    5     y
1    5     n
1    5     y
1    5     n


Example2:

score_df
========
rid score Flag
1    5     n
1    6     y
1    7     n
1    8     y
在这种情况下,标志值仅在分数为6的第二行上为y。输出将如下所示

Example1:

score_df
========
rid score Flag
1    5     y
1    6     n
1    7     y
1    8     n
score_df
========
rid score Flag
1    5     n
1    6     y
1    6     n
1    6     n

因此,我想根据第一次出现的标志值填充行。如何在不循环的情况下在pandas中执行此操作?

创建掩码,用于将第一个
y
值之后的所有值与“比较依据”、“累积求和依据”和“比较gor更大值”(如
0
依据)匹配,并将第一个匹配值设置为仅过滤列值:

m = df['Flag'].eq('y').cumsum().gt(0)

df.loc[m, 'score'] = df.loc[m, 'score'].iat[0]
print (df)
   rid  score Flag
0    1      5    y
1    1      5    n
2    1      5    y
3    1      5    n

如果可能,解决方案不匹配(列中没有
y
值)有点不同,
next
iter
返回第一个值(如果存在),这里它只通过
False
掩码设置
0
值,因此不需要替换

此解决方案也适用于上述数据,因此更为通用

df.loc[m, 'score'] = next(iter(df.loc[m, 'score']), 0)
print (df)
   rid  score Flag
0    1      5    n
1    1      6    n
2    1      7    n
3    1      8    n

创建掩码,用于将第一个
y
值之后的所有值与“比较依据”、“累积求和依据”和“比较gor更大值”(如
0
by)匹配,并将第一个匹配值设置为仅过滤列值:

m = df['Flag'].eq('y').cumsum().gt(0)

df.loc[m, 'score'] = df.loc[m, 'score'].iat[0]
print (df)
   rid  score Flag
0    1      5    y
1    1      5    n
2    1      5    y
3    1      5    n

如果可能,解决方案不匹配(列中没有
y
值)有点不同,
next
iter
返回第一个值(如果存在),这里它只通过
False
掩码设置
0
值,因此不需要替换

此解决方案也适用于上述数据,因此更为通用

df.loc[m, 'score'] = next(iter(df.loc[m, 'score']), 0)
print (df)
   rid  score Flag
0    1      5    n
1    1      6    n
2    1      7    n
3    1      8    n