Datafram中序列的匹配与替换

2024-04-27 03:51:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一项涉及数据帧中匹配代码的任务。有人告诉我,如果我把关系安排得很好,我就可以用图表(数据结构)来完成。不幸的是,我对图形一无所知,所以我不知道该怎么做。你知道吗

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

  1. 每个“id”应被分配最早的可能(最早的一年)“代码”,除了下面概述的一个例外。你知道吗
  2. 如果两个id有几年的匹配代码序列,但其中一个缺少前几年的值,则将从另一个id中为其分配最早的可用代码
  3. 如果两个ID有一个匹配的代码序列,但在以后的几年中有所不同,那么其中一个ID以一种有意义的方式更改了代码(对于我来说,这些代码是不同的)。通过查找最频繁出现的序列,我们假设除此之外的任何序列都是代码更改,并保留该代码而不是替换它。你知道吗

下面是一个帧和所需输出的示例。你知道吗

给定初始左侧,右侧是我想要接收的结果。这里,公司3已经改变了“代码”,因为它的子序列(1140 1140 1115 1115 1118)不太常见(比1140 1140 1115 1115 1117,它出现在两个id中)。ids1和ids2有匹配的子序列(由一颗星和两颗星标记),这使得我们可以得出结论,这两个序列具有相同的初始代码,因此我们将代码1140应用于id2。你知道吗

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]

Tags: 数据方法代码inid图形by关系