我希望将train/valid/test列、最后一个序列设置为test
,将前一个序列设置为valid
+----+-------+----+------+
|user|cnt_seq|item| mode |
+----+-------+----+------+
| 1| 1| 4| train|
| 1| 1| 7| train|
| 1| 2| 2| train|
| 1| 2| 9| train|
| 1| 3| 8| valid|
| 1| 4| 3| test|
| 1| 4| 10| test|
| 2| 1| 6| train|
| 2| 2| 7| valid|
| 2| 3| 1| test|
+----+-------+----+------+
每个用户都有不同的cnt_seq
长度和cnt_seq
个数,所以我的代码是...
test_users = [1, 2]
mdict = df.groupby('user')['cnt_seq'].max().to_dict()
test_idx = [(k, v) for k, v in mdict.items() if k in test_users]
valid_idx = [(k, v-1) for k, v in mdict.items() if k in test_users]
df['mode'] = 'train'
for i, j in valid_idx:
df.loc[(df.user== i) & (df.cnt_seq == j), 'mode'] = 'valid'
for i, j in test_idx:
df.loc[(df.user== i) & (df.cnt_seq == j), 'mode'] = 'test'
但我认为它不太好,因为它需要两个for循环来进行valid/test。我能得到更简单的代码吗?
1条答案
按热度按时间mrfwxfqh1#
试试这个: