群内如何转发填写pandas?

How do you forward fill in pandas within a group?

我有一个 pandas 形式的 DataFrame

quarter user_id # Sessions
2022 Q1 1 9
2021 Q4 1
2021 Q3 1
2022 Q1 2 8
2021 Q4 2
2021 Q3 2

而且我想在每个 user_id 中转发填充 # Sessions 列以获得 table,例如:

quarter user_id # Sessions
2022 Q1 1 9
2021 Q4 1 9
2021 Q3 1 9
2022 Q1 2 8
2021 Q4 2 8
2021 Q3 2 8

我可以用

x.groupby('user_id').apply(lambda x: x.fillna({'# Sessions': x['# Sessions'].ffill()}))

但我有相当大的数据(~10k 用户),这是代码库中非常常见的操作。

.groupby 是必要的还是有更高效的方法来实现同样的目的?

这应该比您正在做的要快得多:

x['# Sessions'] = x.groupby('user_id')['# Sessions'].ffill()

您也可以尝试转换 first(因为 first 跳过 NaN):

df['# Sessions'] = df.groupby('user_id')['# Sessions'].transform('first')

输出:

   quarter  user_id  # Sessions
0  2022 Q1        1         9.0
1  2021 Q4        1         9.0
2  2021 Q3        1         9.0
3  2022 Q1        2         8.0
4  2021 Q4        2         8.0
5  2021 Q3        2         8.0

我们可以避免使用groupby,首先我们使用DataFrame.sort_values, 然后我们只使用 ffill 除了发生 user_id 变化的行。

df2 = df.sort_values('user_id')
df['# Sessions'] = df2['# Sessions'].ffill()\
    .where(df2['user_id'].eq(df2['user_id'].shift()),
           df2['# Sessions'])