我有一个像这样的数据框
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
因此,我想根据第一次出现的标志值来填充行。如何在熊猫中做到这一点而无需循环?
答案 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
值)有些不同,next
和iter
返回第一个值(如果存在),此处设置了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