【问题标题】:Return Value Based on Conditional Lookup on Different Pandas DataFrame基于不同 Pandas DataFrame 条件查找的返回值
【发布时间】:2018-08-26 11:19:08
【问题描述】:

目标:从一个数据框中(有条件地)查找值并将结果放在具有新列名的不同数据框中

df_1 = pd.DataFrame({'user_id': [1,2,1,4,5],
                    'name': ['abc','def','ghi','abc','abc'],
                    'rank': [6,7,8,9,10]})
df_2 = pd.DataFrame ({'user_id': [1,2,3,4,5]})

df_1 # original data

df_2 # new dataframe

在这个通用示例中,我试图创建一个名为“priority_rank”的新列,并且仅根据对 df_1 的条件查找填充“priority_rank”,即:

  • user_id 必须在 df_1 和 df_2 之间匹配
  • 我只对 df_1['name'] == 'abc' 感兴趣,其他都应该是空白

df_2 最终应该是这样的:

|user_id|priority_rank|
     1     6
     2     
     3
     4     9
     5     10

【问题讨论】:

    标签: sql python-3.x pandas lookup-tables


    【解决方案1】:

    一种方法:

    In []:
    df_2['priority_rank'] = np.where((df_1.name=='abc') & (df_1.user_id==df_2.user_id), df_1['rank'], '')
    df_2
    
    Out[]:
       user_id priority_rank
    0        1             6
    1        2              
    2        3              
    3        4             9
    4        5            10
    

    注意:在您的示例中,df_1.name=='abc' 是充分条件,因为在 df_1.name=='abc' 时,user_id 的所有值都相同。我假设情况并非总是如此。

    【讨论】:

      【解决方案2】:

      使用merge

      df_2.merge(df_1.loc[df_1.name=='abc',:],how='left').drop('name',1)
      Out[932]: 
         user_id  rank
      0        1   6.0
      1        2   NaN
      2        3   NaN
      3        4   9.0
      4        5  10.0
      

      【讨论】:

        【解决方案3】:

        你正在寻找map:

        df_2.assign(priority_rank=df_2['user_id'].map(
            df_1.query("name == 'abc'").set_index('user_id')['rank']))
        
           user_id  priority_rank
        0        1            6.0
        1        2            NaN
        2        3            NaN
        3        4            9.0
        4        5           10.0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-10
          • 1970-01-01
          • 2017-04-11
          • 1970-01-01
          • 2016-01-18
          • 1970-01-01
          • 2021-08-05
          • 1970-01-01
          相关资源
          最近更新 更多