【问题标题】:How to Group Rows With Same Values?如何对具有相同值的行进行分组?
【发布时间】:2023-04-02 04:45:02
【问题描述】:

我有一个 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 行。

例如以每组 2 个user_id 划分

     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

如何根据user_iddf 划分为多个组,以及我提到的每个组有选定数量的user_id

【问题讨论】:

    标签: python python-3.x pandas dataframe jupyter-notebook


    【解决方案1】:

    据我了解,您可以使用:

    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
    

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2013-02-05
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多