【问题标题】:Editing a dataframe based on another dataframe基于另一个数据框编辑数据框
【发布时间】:2018-08-23 07:31:38
【问题描述】:

我有一个名为 _data 的数据框,如下所示:

frame   id   x1     y1  x2  y2  score class visibility
  1     1   1363    569 103 241  1      1   0.86014
  2     4   1362    568 103 241  1      1   0.86173
  3     4   1362    568 103 241  1      1   0.86173
  4     5   1362    568 103 241  1      1   0.86173
  5     5   1362    568 103 241  1      1   0.86173
  6     5   1362    568 103 241  1      1   0.86173
  7     6   1362    568 103 241  1      1   0.86173
  8     6   1362    568 103 241  1      1   0.86173
  9     7   1362    568 103 241  1      1   0.86173
  10    7   1362    568 103 241  1      1   0.86173
                         .
                         .
                         .

数据框中有 108003 行和 141 个唯一 ID。一个 ID 代表一个特定的对象,只要该框架具有该对象,该 ID 就会重复。换句话说,我的数据有 141 个不同的对象和 108003 帧。我编写了一个代码来识别具有相同对象但标有不同 ID 的框架。这保存在另一个名为 _data_to_merge 的数据框中,如下所示。

indexID  matchID    
   4        5
   6        7
   8        9
   12       13
   18       19
   20       21
       .
       .
       .

第二个数据框显示哪些索引被错误地分类为不同的对象。 _data_to_merge 中的 'indexID' 与 _data 中的 'id' 相同。

以_data_to_merge中的第一行为例,它表示索引4和5是相同的。因此,我需要将 _data 中所有 'id' 5 的 'id' 值更改为 4。这是更改所有 'id' 后最终表格应该是什么样子的示例。

_datanew:

frame   id   x1     y1  x2  y2  score class visibility
  1     1   1363    569 103 241  1      1   0.86014
  2     4   1362    568 103 241  1      1   0.86173
  3     4   1362    568 103 241  1      1   0.86173
  4     4   1362    568 103 241  1      1   0.86173
  5     4   1362    568 103 241  1      1   0.86173
  6     4   1362    568 103 241  1      1   0.86173
  7     6   1362    568 103 241  1      1   0.86173
  8     6   1362    568 103 241  1      1   0.86173
  9     6   1362    568 103 241  1      1   0.86173
  10    6   1362    568 103 241  1      1   0.86173
                         .
                         .
                         .

'id' 5 的所有行都已更改为 4,'id' 7 的所有行已更改为 6。我该如何处理?

【问题讨论】:

    标签: python python-2.7 pandas dataframe


    【解决方案1】:

    我相信需要mapSeriesset_indexfillna 创建:

    s = _data_to_merge.set_index('matchID')['indexID']
    _data['id'] = _data['id'].map(s).combine_first(_data['id']).astype(int)
    print (_data)
       frame  id    x1   y1   x2   y2  score  class  visibility
    0      1   1  1363  569  103  241      1      1     0.86014
    1      2   4  1362  568  103  241      1      1     0.86173
    2      3   4  1362  568  103  241      1      1     0.86173
    3      4   4  1362  568  103  241      1      1     0.86173
    4      5   4  1362  568  103  241      1      1     0.86173
    5      6   4  1362  568  103  241      1      1     0.86173
    6      7   6  1362  568  103  241      1      1     0.86173
    7      8   6  1362  568  103  241      1      1     0.86173
    8      9   6  1362  568  103  241      1      1     0.86173
    9     10   6  1362  568  103  241      1      1     0.86173
    

    【讨论】:

    • 我不太明白。 new_id 是什么?
    • @RuvenGuna - 它是从 df2 到 df1 的新匹配 ID。还是需要别的东西?
    • 我实际上是想编辑 _data 中的“id”,而不是添加新列。
    • 我想我没有清楚地解释我的问题。我已经编辑了我的问题以更好地解释我的问题。
    • @RuvenGuna - 所以需要将_data_to_merge.set_index('indexID')['matchID'] 更改为s = _data_to_merge.set_index('matchID')['indexID'] 吗?
    【解决方案2】:

    我认为这是你需要的:

    id_to_replace = dict(_data_to_merge[['index_id', 'match_id']].values)
    _data['id'] = _data[['id'].map(id_to_replace)
    

    【讨论】:

    • 嗨,我已经编辑了我的问题以更好地解释我的问题。我尝试运行你的代码,但是当我运行程序时,它说我的代码中的其他一些行,而不是你给我的行,语法无效,当我在没有你的代码的情况下运行它时,程序能够运行。我使用 python 2 时可能存在兼容性问题。
    • 我想知道你得到的错误到底是什么?我看不到任何可能导致兼容性问题的东西...
    • 我也很困惑为什么会这样。这是一个错误示例:` File "main.py", line 152 _data.to_csv("data.csv", sep=',') ^ SyntaxError: invalid syntax`
    • 这不是很有帮助。您必须发布整个文件或隔离仍然显示错误的行。
    • 对不起,由于格式有限,但基本上是 .在 data.to_csv 中并说它的语法无效。当我注释掉那条线时,它会指向一个 : in else: 也说这是一个语法错误。但是,当我删除您向我建议的代码行时,程序能够在没有这些语法错误的情况下运行。我希望这能更好地解释它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2020-09-23
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多