在Dataframe中匹配和替换序列

时间:2018-01-25 02:31:04

标签: python pandas match matching

我正在处理涉及数据框中匹配代码的任务。有人告诉我,如果我很好地布置关系,我可以使用图形(数据结构)来做到这一点。不幸的是我对图表一无所知,所以我不知道如何去做。

我想根据以下标准匹配'代码':

  1. 每个'id'应分配最早的(最早年份)'代码',但有一个例外情况,概述如下。
  2. 如果两个ID在几年内具有匹配的代码序列,但其中一个缺少前几年的值,则会从其他ID中为其分配最早的可用代码。
  3. 如果两个id具有匹配的代码序列,但在以后的几年中有所不同,则其中一个ID以有意义的方式更改了代码(这些代码对我来说是不同的)。通过查找最常出现的序列,我们假设除此之外的任何序列都是代码更改并保留该代码而不是替换它。
  4. 这是一个框架和所需输出的示例。

    鉴于最初的左侧,右侧是我想要接收的结果。在这里,公司3改变了“代码”,因为它的后续序列(1140 1140 1115 1115 1118)不太常见(比1140 1140 1115 1115 1117,两个ID出现)。 ids 1和2(由一星和两星标记)有匹配的子序列,这使我们可以得出结论,两者具有相同的初始代码,因此我们将代码1140应用于id 2。

    year    id  code        year    id  code
    2004    1   1140        2004    1   1140
    2005    1   1140        2005    1   1140
    2006    1   1115*       2006    1   1140
    2007    1   1115*       2007    1   1140
    2008    1   1117*       2008    1   1140
    2006    2   1115**      2006    2   1140
    2007    2   1115**      2007    2   1140
    2008    2   1117**      2008    2   1140
    2004    3   1140        2004    3   1140
    2005    3   1140        2005    3   1140
    2006    3   1115        2006    3   1140
    2007    3   1115        2007    3   1140
    2008    3   1118***     2008    3   1118
    

    我的匹配规则是否过于复杂?图表真的是最好的方法 - 在这种情况下,我从哪里开始?您能想到一种更简单的方法吗?

    我知道这有点令人困惑,所以如果需要澄清,请告诉我。谢谢。

    编辑:

    我做了一个非常初步的尝试。我的尝试只能成功替换特定ID中的值,即便如此,我也无法弄清楚如何将其分配回原始数据帧。

    # group by id
    by_id = df.groupby(['id'])
    
    # replace with first code in each group
    for name, group in by_id:
    
        selected = group['id'].reset_index()
        selected['id'] = selected['id'][0]
    

0 个答案:

没有答案