由于您有多个条件需要选取数据,可以使用pandas.core.groupby.DataFrameGroupBy.transform方法构建一个选择行的掩码,并执行布尔索引来选取数据:
# 先按'reviewTime'列对数据进行排序
g = df.sort_values('reviewTime')
# 按'reviewerID'列进行分组,且不对组内排序
g = g.groupby('reviewerID', sort=False)
# 要选取的行数
N = 2
# 获取每个分组的大小并枚举行号
# 对于大小超过N的组,选取最后N行
m1 = g.transform('size').gt(N)
m2 = g.cumcount(ascending=False).lt(N)
m = m1 & m2
# 使用布尔索引选取不满足条件的行作为训练集
df_train = df[~m]
# 使用布尔索引选取满足条件的行作为验证集
df_val = df[m]
示例:
# 原始数据df
overall
reviewerID asin reviewTime
0 0 2024-01-01 0
1 2024-01-03 1
2 2024-01-05 2
3 2024-01-02 3
1 4 2024-01-01 4
5 202-01-02 5
2 6 2024-01-02 6
7 2024-01-01 7
8 2024-01-03 8
3 9 2024-01-01 9
# 训练集df_train
overall
reviewerID asin reviewTime
0 0 2024-01-01 0
3 2024-01-02 3
1 4 2024-01-01 4
5 2024-01-02 5
2 7 2024-01-01 7
3 9 2024-01-01 9
# 验证集df_val
overall
reviewerID asin reviewTime
0 1 2024-01-03 1
2 2024-01-05 2
2 6 2024-01-02 6
8 2024-01-03 8
中间步骤展示:
# 中间结果df
overall size cumcount m1 m2 m
reviewerID asin reviewTime
0 0 2024-01-01 0 4 3 True False False
1 2024-01-03 1 4 1 True True True
2 2024-01-05 2 4 0 True True True
3 2024-01-02 3 4 2 True False False
1 4 2024-01-01 4 2 1 False True False
5 2024-01-02 5 2 0 False True False
2 6 2024-01-02 6 3 1 True True True
7 2024-01-01 7 3 2 True False False
8 2024-01-03 8 3 0 True True True
3 9 2024-01-01 9 1 0 False True False