为了账号安全,请及时绑定邮箱和手机立即绑定

如何将具有相同值的行分组?

如何将具有相同值的行分组?

达令说 2021-12-08 10:18:48
我有一个DataFrame df这样的:     user_id  movie_id  rating32236   1        1        523171   1        2        383307   1        3        462631   1        4        347638   1        5        326184   2        1        41333    5        1        4172     5        2        354487   6        1        452430   7        4        518504   10       1        44617    10       4        4我想df根据 随机分组user_id,并且每组具有相同数量的user_id(如果不能平均划分,至少具有相似数量的user_id),但不合user_id并行。例如user_id,每组除以 2     user_id  movie_id  rating32236   1        1        523171   1        2        383307   1        3        462631   1        4        347638   1        5        352430   7        4        5     user_id  movie_id  rating26184   2        1        418504   10       1        44617    10       4        4     user_id  movie_id  rating1333    5        1        4172     5        2        354487   6        1        4我写了一个方法group(df, n):def group(df, n) :    shuffled = df.sample(frac=1)    result = np.array_split(shuffled, n)     dict = {}    for i, part in enumerate(result):        dict['df_'+str(i+1)] = part    return dict但它不适用于出现在多行中的相同数字,例如df. 而且我只能设置分成多少组,不能设置user_id每个分成多少组。如何df根据 进行分组user_id,并且每个组都具有user_id我提到的选定数量?
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

首先,获取唯一的用户 ID 并随机排列它们:


uniques = np.random.permutation(df['user_id'].unique())


拆分唯一 ID(假设每个拆分 2 个 ID):


splits = np.array_split(uniques, len(uniques) // 2)


定义一个基于索引值对行进行分组的函数:


def grouper(value):

    return np.argmax([value in split for split in splits])

并使用它:


for group in df.set_index('user_id').groupby(grouper):

    print(group)


查看完整回答
反对 回复 2021-12-08
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

据我了解,您可以使用:


d={'df'+str(e):df[df.user_id.isin(i)] for e,i in 

    enumerate(np.array_split(np.random.permutation(df.user_id.unique()),

                                        len(df.user_id.unique())/2))}

输出


{'df0':        user_id  movie_id  rating

 26184        2         1       4

 18504       10         1       4

 4617        10         4       4, 'df1':        user_id  movie_id  rating

 32236        1         1       5

 23171        1         2       3

 83307        1         3       4

 62631        1         4       3

 47638        1         5       3

 52430        7         4       5, 'df2':        user_id  movie_id  rating

 1333         5         1       4

 172          5         2       3

 54487        6         1       4}

您可以调用此字典中的每个键:


print(d['df1'])


       user_id  movie_id  rating

32236        1         1       5

23171        1         2       3

83307        1         3       4

62631        1         4       3

47638        1         5       3

52430        7         4       5


查看完整回答
反对 回复 2021-12-08
  • 2 回答
  • 0 关注
  • 178 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信