【问题标题】:How to pick multiple rows' value of dataframe according to multiple cells?如何根据多个单元格选择多行数据框的值?
【发布时间】:2019-10-16 10:21:04
【问题描述】:

我有一个 (user_id,session_id,items1) 的数据框,每个用户有多个会话,我想为每个用户单独选择每个会话以比较其项目,我使用列表列表但它返回 0。如何懂吗?

Dataframe

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]}}

【问题讨论】:

  • 发布数据框的图像无助于回答。如果无法重现示例数据框,就很难调查问题。请提供一个可以重现数据帧的小代码。做一个简单的df[:15].to_dict() 将提供前 15 行的字典,我们可以使用它来重新创建数据框并查看您的问题。
  • 感谢回复.. 前 11 行 3 位用户
  • 能否请您发布一个示例数据框和所需的输出?仅从代码和图片中并不清楚任务。例如,您的代码第一行的 items1_list 中的内容是什么?
  • 我按 user_id 对用户的会话进行了分组,我希望 user_id 的 (items1) 中的所有项目 - 逐个会话 - 在一个列表中。

标签: python pandas nested-loops


【解决方案1】:

为了效率,让我们按用户排序列表

        # 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]]

为了了解代码的作用以及如何使用它,我建议您打印不同级别的变量。

如果代码对您有效,我请您单击检查标记。这是奖励我在这里帮助您的努力的好方法。

【讨论】:

  • 我会在你的代码中修改什么以获取列表中特定用户的会话(例如 user1 有 3 个会话),或者我可以在哪里为当前用户添加条件..
  • 我回答了关于会话计数的问题,已经在编辑的代码中。我不明白你关于用户条件的问题,太模糊了。
  • 要清楚,请返回我修改它的问题(目标输出部分),您的代码适用于所有人,但我未能指定(如果 data.user_id 和 user_id 中的 user_id == current_user)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2019-06-16
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多