【问题标题】:How can I iterate over two dataframes to compare data and do processing? [duplicate]如何迭代两个数据帧以比较数据并进行处理? [复制]
【发布时间】:2020-12-12 00:37:33
【问题描述】:

我有两个不同的数据框: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 |
| 10          | Special |
| 17          |Elephant |
| 17          |Elephant |
| 17          |Elephant |
| 18          | Special |
| 18          | Special |
| 20          |  Skunk  |
| 20          |  Skunk  |
| 21          | Special |
| 26          | Antelope|
+-------------+---------+

所需的DF

+-------------+---------+------+-------------+
|dfA.context# |dfA.event| Name |dfA.newContext#|
+-------------+---------+------+-------------+
| 0           | Special | Bob  |           0 |
| 2           | Special | Joan |           1 |
| 4           |    Bird | Susie|           2 |
| 5           | Special | Alice|           3 |
| 6           | Special | Tom  |             |
| 7           | Special | Luis |             |
| 8           |  Parrot | Jill |           6 |
| 9           | Special | Reed |           7 |
| 10          | Special | Lucas|             |
| 11          |   Snake | Kat  |           9 |
| 12          | Special | Bill |          10 | 
| 13          | Special | Leo  |             |
| 14          | Special | Peter|             |
| 15          | Special | Mark |             |
| 16          | Special | Joe  |             |
| 17          | Special | Lora |             |
| 18          | Special | Care |             |
| 19          |Elephant | David|          17 |
| 20          | Special | Ann  |          18 |
| 21          | Special | Larry|             |
| 22          |   Skunk | Tony |          20 |
+-------------+---------+------+-------------+

如何一次遍历两个数据框并访问信息?

【问题讨论】:

  • 你卡在哪一部分了?
  • 我对如何准确地遍历两个数据帧并访问每个行/列中的信息感到困惑。我认为 pandas 对循环不是很友好,但我认为这可能是更明确地迭代以处理我的每个案例的最佳方式。
  • 如果你有一个数据框df,你可以按行遍历它:for i in range(len(df)):,在for循环访问中,每个元素都可以使用df.loc[row, col]访问。另外,如果您想更改某些元素,请使用df.at[row, col] = new_value

标签: python pandas dataframe loops


【解决方案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: 您可以在操作两个数据框以准备合并后将两个数据框合并在一起:

  1. dfA - 使dfA 中的context 列等于index,但在更改之前,将其保存为系列s 以备后用
  2. dfB - 删除重复项,重置索引,并将索引名称更改为 newContext 以准备合并。
  3. 合并 eventcontext 并将 newContext 值替换为 context 值,其中为 null。
  4. 使用df['context'] = scontext 改回原来的数据

s = 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'] = s
df
Out[9]: 
    context     event   Name newContext
0         0   Special    Bob          0
1         2   Special   Joan          1
2         4      Bird  Susie          2
3         5   Special  Alice          3
4         6   Special    Tom           
5         7   Special   Luis           
6         8    Parrot   Jill          6
7         9   Special   Reed          7
8        10   Special  Lucas           
9        11     Snake    Kat          9
10       12   Special   Bill         10
11       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         17
18       20   Special    Ann         18
19       21   Special  Larry           
20       22     Skunk   Tony         20

【讨论】:

  • 嗨大卫,谢谢!我也准备在准备之后合并,但仅限于上下文,因为 dfA 中有许多“特殊”事件(但我只对其中一些数据感兴趣)。我想保留 dfB 中的所有行 - 我基本上只想将行数据从 dfA 添加到 dfB。该解决方案适用于显示的这组数据,但是有没有办法遍历并计算 dfA 上下文和 dfA newContext 之间的偏移量?我需要应用它来获取一些特殊事件的 dfA newContext。
  • @hollyj 在 Stack Overflow 中通常不鼓励迭代调试。如果我的解决方案回答了您发布的特定问题(输入/输出),请考虑接受并支持答案。您可以使用新的输入数据和预期的输出数据(此解决方案不起作用的地方)发布一个新问题,以及我或其他人可以尝试提出解决方案的地方。
  • 我同意长循环不是最有效的方式,但是因为在某些情况下偏移量会发生变化,我认为这可能是最好的方式..例如,数据将变为偏移量为 8,我需要知道要使用哪个顺序列出的“特殊”事件和相应的名称。我将根据在此“特殊”事件之前使用 dfA newContext - dfA 上下文的 8 偏移量选择正确的“特殊”事件和名称。
  • 道歉,如果这是糟糕的评论礼仪,但为了完整起见,我在这里添加了一个新的后续问题:link
  • @hollyj 不,这完全没问题。我明天会调查,但在那之前可能有人会回答你的问题。
猜你喜欢
  • 2022-09-29
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多