群内如何转发填写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'])
我有一个 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'])