【问题标题】:how to assign a value to a variable based on its relationship with another data frame in Python如何根据变量与Python中另一个数据框的关系为变量赋值
【发布时间】:2014-08-29 21:36:51
【问题描述】:

我的问题是我有一个数据框包含所有开始和结束日期以及每种类型的相应 ID。我想使用这个数据框根据日期将 id 分配给另一个数据框。具体来说,如果第二个数据帧中的日期在第一个数据帧的开始日期和结束日期之间,它将被签名为与第一个数据帧相同的 ID。

#Here are two data frames
m1=pd.DataFrame({'type':['A','A','A','B','B','B'],
                 'id':[1,2,3,1,2,3],
                 'startdate':[20120201,20120301,20130401,20130301,20130501,20140601],
                 'enddate':[20120218,20120324,20130425,20130312,20130521,20140706]})

m2=pd.DataFrame({'type':['A','A','B','B'],
                 'pin':[12,33,25,47],
                 'date':[20120213,20130411,20130504,20140704]})

#ideally the result should be 

m3=pd.DataFrame({'type':['A','A','B','B'],
                 'pin':[12,33,25,47],
                 'date':[20120213,20130411,20130504,20140704],
                 'id':[1,3,2,3]})

我想不出更好的方法来做到这一点。因为有数百万条记录,我需要一种更有效的方式来运行代码。有任何想法吗?非常感谢!

【问题讨论】:

    标签: python for-loop pandas


    【解决方案1】:

    这是我对您问题的解决方案。

    实际上,我将尝试使用合并/连接将 m1 和 m2 连接到一个数据帧中。

    获得合并的数据框后,我将进行测试以确保“日期”列在“开始日期”和“结束日期”内失败

    因此您的代码将如下所示

    ## merged dataframe
    df_merged = pd.merge(m2, m1, how='inner', left_on='type', right_on='type')
    
    ## create function to check that date fails between start and end date
    f = lambda x : x if x['date'] >  x['startdate'] and x['date'] < x['enddate'] else     None
    
    ## apply function to dataframe
    df_merged=df_merged.apply(f, axis=1)
    
    ## drop na values
    df_merged.dropna()
    

    【讨论】:

    • +1,你可能应该将datestartdate等转换为datetimedtype,以防有991001之类的值而不是19991001
    • 是的。这将是最佳的。
    • 感谢您的及时回复!我想过这个,但实际上我的 m1 有 70,000 多条记录,而我的 m2 有 4000 多条记录我只是担心如果我将它们合并在一起,计算机会耗尽内存。稍后当我在我的 python 中完成某些事情时,我会尝试你的代码,以防它崩溃。
    • 我确实在我的真实数据上尝试过,但不知何故我不知道为什么在应用该函数后,结果变成了两列;一列包含每一行的联系字符串,另一列是索引。像type A startdate 201302003 enddate 20130207 id 2 date 20130205 这样的东西在一个单元格中我不知道这里可能会出现什么问题..
    【解决方案2】:

    实际上接受的答案对我不起作用,因为我在 cmets 中提到的数据很奇怪,所以我从另一种方式得到结果:

     ## merged dataframe
    df_merged = pd.merge(m2, m1, how='inner', left_on='type', right_on='type')
    
    ## create the index(True and False) of the rows you want to keep
    keepindex =(df_merged['date'] >  df_merged['startdate']) & (df_merged['date'] < df_merged['enddate'])
    
    ## subset the data frame by the index
    df_merged=df_merged[keepindex]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多