如何遍历两个数据帧来比较数据并进行处理?

我有两个不同的数据框:A、B。事件列具有我用来比较两个数据框的相似数据。我想给 Dataframe A 一个新列 dfA.newContext#。


为此,我需要使用“事件”列。我想遍历 Dataframe A 以找到 Event 的匹配项并将 dfB.context# 分配给 dfA.newContext#


我认为循环是最好的方法,因为我需要检查一些条件。


这可能要求有点多,但我真的卡住了..我想做这样的事情:


offset = 0

Iterate through dfA:

    extract event

    extract context#

        Iterate through dfB:

            if dfB.event == dfA.event:

                dfA.newContext# = dfB.context#

                offset = dfA.new_context# - dfA.context#

                if dfB.event == "Special":

                    dfA.newContext# = dfA.context# - offset

         

数据框A


+-------------+---------+------+

|dfA.context# |dfA.event| Name |

+-------------+---------+------+

| 0           | Special | Bob  |

| 2           | Special | Joan |

| 4           |    Bird | Susie|

| 5           | Special | Alice|

| 6           | Special | Tom  |

| 7           | Special | Luis |

| 8           |  Parrot | Jill |

| 9           | Special | Reed |

| 10          | Special | Lucas|

| 11          |   Snake | Kat  |

| 12          | Special | Bill |

| 13          | Special | Leo  |

| 14          | Special | Peter|

| 15          | Special | Mark |

| 16          | Special | Joe  |

| 17          | Special | Lora |

| 18          | Special | Care |

| 19          |Elephant | David|

| 20          | Special | Ann  |

| 21          | Special | Larry|

| 22          |   Skunk | Tony |

+-------------+---------+------+

数据框B


+-------------+---------+

|dfB.context# |dfB.event|

+-------------+---------+

| 0           | Special |

| 0           | Special |

| 0           | Special |

| 1           | Special |

| 1           | Special |

| 1           | Special |

| 1           | Special |

| 2           |    Bird |

| 2           |    Bird |

| 3           | Special |

| 6           |  Parrot |

| 6           |  Parrot |

| 6           |  Parrot |

| 6           |  Parrot |

| 7           | Special |

| 7           | Special |

| 9           |   Snake |

| 9           |   Snake |

| 9           |   Snake |

+-------------+---------+


繁星淼淼
浏览 94回答 1
1回答

万千封印

95% 的时间你可以使用 pandas 向量化方法并消除循环的需要。在这种情况下,您可以只使用pd.merge一个简单、干净且高效的方法来替代长循环。编辑:(答案#1):实际上,您可以进行更高级的合并,left_on=dfA.index, right_on='context'并在合并后与其他清理操作一起在一行中执行此操作,但请参阅下面更完整的答案,它采用类似的方法:df = (pd.merge(dfA, dfB['context'], how='left', left_on=dfA.index, right_on='context')         .drop_duplicates()         .dropna(subset=['Name'])         .drop('context', axis=1)         .rename({'context_x' : 'context', 'context_y' : 'newContext'}, axis=1).fillna(''))答案 #2: 在为合并准备操作两个数据帧之后,您可以将两个数据帧合并在一起:dfA- 使context列dfA等于index,但在更改之前,将其保存为一个系列s以备后用dfB- 删除重复项,重置索引,并将索引的名称更改为newContext以准备合并。合并event并用空值context替换newContext值。context更改context回其原始数据df['context'] = ss = dfA['context']dfA['context'] = dfA.index.astype(str)dfB = dfB.drop_duplicates().reset_index().rename({'index' :'newContext'}, axis=1).astype(str)df = pd.merge(dfA, dfB, how='left', on=['event', 'context'])df['newContext'] = df['newContext'].where(df['newContext'].isnull(), df['context']).fillna('')df['context'] = sdfOut[9]:     context     event   Name newContext0         0   Special    Bob          01         2   Special   Joan          12         4      Bird  Susie          23         5   Special  Alice          34         6   Special    Tom           5         7   Special   Luis           6         8    Parrot   Jill          67         9   Special   Reed          78        10   Special  Lucas           9        11     Snake    Kat          910       12   Special   Bill         1011       13   Special    Leo           12       14   Special  Peter           13       15   Special   Mark           14       16   Special    Joe           15       17   Special   Lora           16       18   Special   Care           17       19  Elephant  David         1718       20   Special    Ann         1819       21   Special  Larry           20       22     Skunk   Tony         20
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python