Как выбрать значение нескольких строк данных в соответствии с несколькими ячейками? - PullRequest
2 голосов
/ 16 октября 2019

У меня есть фрейм данных (user_id, session_id, items1), у каждого пользователя есть несколько сеансов, я хочу выбрать каждый сеанс отдельно для каждого пользователя, чтобы сравнить его элементы, я использовал список из списка, но он возвращает 0. Какполучить это?

Фрейм данных

items1_list = list(items1_list) # list of all items in each session_id for user_id
for i in data.user_id: # user_id loop
    for j in data.session_id: # session_id loop
        for l in range(3): # number of sessions for each user, NO 3 for testing
            items1_list[l] = data.loc[i].loc[j].items1 
print (items1_list)

Пример фрейма данных:

user_id  session_id      items1                                        
   1         19      [214561790, 214561790, 214611457, 214611457]     
             43      [214691587, 214587915]                           
             52      [214716982, 214716984]
   2         42      [214819745, 214819745]                           
             58      [214515834, 214515830]                                  

целевой выход (если текущий пользователь = user1):

[[214561790, 214561790, 214611457, 214611457], [214691587, 214587915], [214716982, 214716984]]

целевой вывод (если текущий пользователь = user2):

[[214819745, 214819745],[214515834, 214515830]]

это первые 11 строк (сеансы user1, user2, user3):

{'items1': {(1, 19): [214561790, 214561790, 214611457, 214611457],
  (1, 27): [214827028,214827017,214537796,214840762,214707930,214707930,
214585652,214536197,214536195,214646169],
  (1, 43): [214691587, 214587915],
  (1, 52): [214716982, 214716984],
  (1, 54): [214819468, 214716977, 214716977, 214716977, 214716977, 214716939],
  (2, 42): [214819745, 214819745],
  (2, 58): [214515834, 214515830],
  (2, 62): [214714794, 214601407],
  (2, 87): [214652220,214840483,214840483,214717286,214558807,214821300,214826908,
  214826908,214826908,214554637,214819430,214819430,214826837,214826837,
 214820392,214820392,214586694,214819376,214553844,214601229,214555500,
 214695127,214819760,214717850,214718385,214743369,214743369],
  (3, 28): [214836789, 214836789, 214710804],
  (3, 140837): [214586711,214821305,214821305,214821305,214612721,214586711,
214586711,214586711,214837442,214821339,214821339,214553735,214553735]},
 'items2': {(1, 19): 0,
  (1, 27): 0,
  (1, 43): 0,
  (1, 52): 0,
  (1, 54): 0,
  (2, 42): 0,
  (2, 58): 0,
  (2, 62): 0,
  (2, 87): 
[214652220,214840483,214743369,214826837,214820392,214826908,214819430],
  (3, 28): 0,
  (3, 140837): [214821339, 214586711, 214821339, 214586711]}}

1 Ответ

0 голосов
/ 18 октября 2019

Для эффективности давайте упорядочим список по пользователю

        # order to get a list
        df.sort_values(by=['user_id'])

Затем мы используем списки сжатия, чтобы получить все элементы, связанные с сеансом и пользователем.

        itPerSession = [] #output list

        # loop to extract the info
        for i in range(df.shape[0]): #df.shape[0] are number of rows

            for user in df['user_id']:

                vUser    = df['user_id'][i]
                vSession = [session for session in df['session_id'] if user]
                vItems   = [items for items in df['items1'] if vSession]
                varTextS = 'Session:'
                varTextU = 'by user:'
                chain    = [varTextS,vSession[i],vItems[i],varTextU,vUser]

            itPerSession.append(chain) #outside the user's loop to avoid repetition
            print(itPerSession)

             [['Session:', 19, [214561790, 214561790, 214611457, 214611457], 'by user:', 1], 
             ['Session:', 43, [214691587, 214587915], 'by user:', 1], 
             ['Session:', 52, [214716982, 214716984], 'by user:', 1], 
             ['Session:', 43, [214819745, 214819745], 'by user:', 2], 
             ['Session:', 58, [214515834, 214515830], 'by user:', 2]]

Надеюсь, это поможет.

Чтобы напечатать число сеансов по пользователю, используйте groupby, первый аргумент - это то, что вы считаете, в данном случае user_id:

         df.groupby(['user_id'])['session_id'].count()        

Результат:

           user_id
                1    2
                2    2

Получение информации для конкретного пользователя с использованием того же кода:

    itPerSession = [] #output list

    userId = 1 #user definition

    # loop to extract the info

    for i in range(df.shape[0]): #df.shape[0] are number of rows​

                for user in df['user_id']:​

                    vUser    = (df['user_id'][i] == userId) # fix the user
                    vSession = [session for session in df['session_id'] if user]
                    vItems   = [items for items in df['items1'] if vSession]
                    varTextS = 'Session:'
                    varTextU = 'by user:'
                    chain    = [varTextS,vSession[i],vItems[i],varTextU,userId]

                    if vUser: #it's a true condition, and not the user
                        itPerSession.append(chain) 

                    print(itPerSession)
                    [['Session:', 19, [214561790, 214561790, 214611457, 214611457], 'by user:', 1], ['Session:', 52, [214716982, 214716984], 'by user:', 1]]

Чтобы понять, что делает код и как с ним играть, я предлагаю вам напечатать переменные вразные уровни.

И если у вас работает код, прошу вас, пожалуйста, нажать на маркер чека. Это хороший способ вознаградить меня за то, что я помог тебе здесь.

...