【问题标题】:Most efficient way to rename elements in dataframe of lists重命名列表数据框中元素的最有效方法
【发布时间】:2019-08-21 08:55:36
【问题描述】:

我有两个数据框,其中一个包含宠物 ID 和名称,另一个包含用户和他们喜欢的宠物的 ID 列表。我想把它变成一个字典,其中键是用户,值是他们喜欢的宠物的所有名字。

    id  name
0   4   Bert
1   5   Ernie
2   6   Jeff
3   7   Bob
4   8   Puppy
5   9   Socks
6   12  Cyoot
    user_email  likes
0   matt@google.com [4, 5, 6, 7, 8, 9, 12]
1   gabe@google.com [4, 8, 9, 6, 5, 12]

【问题讨论】:

    标签: python arrays pandas dictionary


    【解决方案1】:

    首先。将宠物id设置为索引:

    pets.set_index('id', inplace=True)
    

    然后,为每个“likes”列表申请一个函数,将每个like替换为一个对应的宠物名:

    users.likes = users.likes.map(lambda likes: [pets.loc[like]['name'] for like in likes])
    

    最后 - 你所要做的就是将你的数据框变成字典:

    users.set_index('user_email').to_dict()['likes']
    

    【讨论】:

      【解决方案2】:

      据我了解,你可以试试:

      d= df.set_index('id')['name'].to_dict()
      df1.likes=df1.likes.apply(lambda x: [d.get(item,item)  for item in x])
      print(df1)
      

              user_email                                          likes
      0  matt@google.com  [Bert, Ernie, Jeff, Bob, Puppy, Socks, Cyoot]
      1  gabe@google.com       [Bert, Puppy, Socks, Jeff, Ernie, Cyoot]
      

      让听者对电子邮件点赞:

      print(df1.set_index('user_email')['likes'].to_dict())
      
      {'matt@google.com': ['Bert', 'Ernie', 'Jeff', 'Bob', 'Puppy', 'Socks', 'Cyoot'],\
        'gabe@google.com': ['Bert', 'Puppy', 'Socks', 'Jeff', 'Ernie', 'Cyoot']}
      

      【讨论】:

      • 这看起来不错,我有一种预感,它对我不起作用的唯一原因是这些列表的元素实际上是 str 类型,并且该 dict 的键正在设置作为整数。
      • 澄清一下,列表本身其实就是一个列表,只是里面的元素是字符串
      • @zintj 那么如果你做d= df.astype(str).set_index('id')['name'].to_dict() 然后试试这个呢?只是猜测它应该可以工作
      【解决方案3】:

      假设您的第二个数据框中的 likes 列是 list 类型,我们可以执行以下操作:

      将列表取消嵌套到行

      df3 = df2.set_index('user_email').likes.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'likes'})
      
      print(df3)
              user_email  likes
      0  matt@google.com    4.0
      1  matt@google.com    5.0
      2  matt@google.com    6.0
      3  matt@google.com    7.0
      4  matt@google.com    8.0
      5  matt@google.com    9.0
      6  matt@google.com   12.0
      0  gabe@google.com    4.0
      1  gabe@google.com    8.0
      2  gabe@google.com    9.0
      3  gabe@google.com    6.0
      4  gabe@google.com    5.0
      5  gabe@google.com   12.0
      

      将名称合并到数据框

      df4 = df3.merge(df1, left_on='likes', right_on='id').drop(['likes', 'id'],axis=1)
      
      print(df4)
               user_email   name
      0   matt@google.com   Bert
      1   gabe@google.com   Bert
      2   matt@google.com  Ernie
      3   gabe@google.com  Ernie
      4   matt@google.com   Jeff
      5   gabe@google.com   Jeff
      6   matt@google.com    Bob
      7   matt@google.com  Puppy
      8   gabe@google.com  Puppy
      9   matt@google.com  Socks
      10  gabe@google.com  Socks
      11  matt@google.com  Cyoot
      12  gabe@google.com  Cyoot
      

      使用groupby将行转换回列表

      df_final = df4.groupby('user_email').agg(list).reset_index()
      
      print(df_final)
              user_email                                           name
      0  gabe@google.com       [Bert, Ernie, Jeff, Puppy, Socks, Cyoot]
      1  matt@google.com  [Bert, Ernie, Jeff, Bob, Puppy, Socks, Cyoot]
      

      【讨论】:

        猜你喜欢
        • 2022-11-16
        • 2021-01-31
        • 1970-01-01
        • 2013-09-04
        • 2020-08-30
        • 1970-01-01
        • 2014-09-03
        • 2018-09-18
        • 1970-01-01
        相关资源
        最近更新 更多