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

我有一个DataFrame df这样的:


     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

26184   2        1        4

1333    5        1        4

172     5        2        3

54487   6        1        4

52430   7        4        5

18504   10       1        4

4617    10       4        4

我想df根据 随机分组user_id,并且每组具有相同数量的user_id(如果不能平均划分,至少具有相似数量的user_id),但不合user_id并行。


例如user_id,每组除以 2


     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


     user_id  movie_id  rating

26184   2        1        4

18504   10       1        4

4617    10       4        4


     user_id  movie_id  rating

1333    5        1        4

172     5        2        3

54487   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我提到的选定数量?


达令说
浏览 179回答 2
2回答

冉冉说

首先,获取唯一的用户 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)

梵蒂冈之花

据我了解,您可以使用: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  rating32236        1         1       523171        1         2       383307        1         3       462631        1         4       347638        1         5       352430        7         4       5
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python