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

时间:2020-03-18 05:45:52

标签: python pandas

我有一个像这样的数据框

Example1:

score_df
========
rid score Flag
1    5     y
1    6     n
1    7     y
1    8     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。输出看起来像这样

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

因此,我想根据第一次出现的标志值来填充行。如何在熊猫中做到这一点而无需循环?

1 个答案:

答案 0 :(得分:2)

创建一个掩码,以匹配第一个y值之后的所有值,并用compare Series.eq,累积总和Series.cumsum进行比较,并将比0大的gor比较Series.gt并将第一个匹配值设置为仅过滤的列值:

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

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

如果可能的话,不匹配的解决方案(列中没有y值)有些不同,nextiter返回第一个值(如果存在),此处设置了0个值仅使用False遮罩,因此请勿更换。

此解决方案也适用于上面的数据,因此更通用。

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