【问题标题】:How to fix mixed up indexes如何修复混合索引
【发布时间】:2020-11-21 22:28:49
【问题描述】:

我对数据框中的索引有疑问。我有一个看起来像这样的数据:

df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321'],
'A1': [111, 222, 333, 444],
'A2': [555, 666, 777, 888],
'A3': [999, 123, 456, 789],
'A4': [101, 202, 303, 404],
'QQ': [1.3, 2.5, 3.7, 4.9]});

我正在处理数据,并且在某些时候我创建了一个类似的数据框,其中包含原始数据中的一些数据,但在某处发生了数据索引的混合,因此新数据如下所示:

df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
'A2': [888, 666, 555, 777],
'A3': [789, 123, 999, 456],
'A4': [404, 202, 101, 303]});

行中的数据是好的,只是索引是错误的,所以我需要新的数据帧,但是第二个数据帧中的行索引与第一个数据帧中的索引匹配,例如第一行编号为 444、888、789 和 404 的索引应为 3,而不是 0。我该怎么做?我可能应该将第二个数据帧的每一行与第一个数据帧进行比较,如果第二个数据帧中的行与第一个数据帧的一行中的数据匹配,则将第二个数据帧中该行的索引更改为匹配行的索引第一个数据框,但我不知道该怎么做。有什么建议吗?

来自 cmets 的更新:

  1. 我需要这些索引,但我需要它们正确,所以它们匹配,即第二个表中的索引遵循第一个表中的索引。另外,我不能单独使用任何列,因为 non 是唯一的。只有整行是唯一的。
  2. 我可能应该补充一点,这两个表不是真实的,而是作为示例创建的,我现在看到 ID 列具有误导性。我已将其更改为 AA,以避免混淆。所以,正如我上面所说,列不是唯一的,只有整个行是唯一的。真实的表有 200 多列和数千行。
  3. 我无法包含代码,因为它又大又复杂,而且我不知道混淆发生在哪里。这也无关紧要,因为我正在谈论的数据已经收集并保存在 CSV 文件中,因此这两个数据框实际上是从这些文件中导入的。这是我的问题。即使我修复它,我也无法重新运行原始代码,因为这需要两周时间。我必须修复第二个数据帧中的索引,如果有人知道如何做到这一点,我怀疑这并不复杂。正如我所说,行中的数据很好,只是索引混淆了
  4. 不,它只是这个东西的一个名字,其余的数据都是关于的。索引是指数据帧索引,因为它是在创建数据帧时由熊猫默认创建的。整个问题是,我通过从 CSV 文件导入数据创建了第一个数据框,对这些数据做了一些非常耗时的工作,并将结果导出到另一个 CSV 文件。稍后我导入第二个 CSV 文件进行分析时,我发现具有相同数据的行的索引不匹配。所以现在我必须修复索引,否则我将失去大约两周的工作时间
  5. 是的,它是行和列的子集。数据应该是一样的,只是索引混淆了。如果我可以将 df2 的每一行与 df1 进行比较,找出 df1 中该行数据的索引是什么,然后更改 df2 中该行的索引,这将解决问题。我只需要 df2 中的行索引与 df1 的相关行索引匹配。 df2 索引是混合的。 df1 中的索引与两个数据帧中的索引相同。
  6. 不,df2 只有 df1 的一些列和 df1 的一些行,但它们之间的数据会匹配。顺序不同,也就是说,如果相同,则索引不同。但我想有可能对行进行排序,而索引不是按顺序排列的。

【问题讨论】:

    标签: python pandas dataframe indices


    【解决方案1】:
    • pandas.concat 两个数据框
      • concat 两个数据框,但仅在两个数据框的列上
      • 连接顺序很重要,df1 需要在前
      • df1 将带来不在df2 中的行
    • 使用.duplicated 创建蒙版
      • df1df2 之间的所有匹配行将是 True,但来自 df1 的额外行将是 False
        • 应用掩码,这将删除多余的行
        • dfc 现在只有重复的行,df1 中的所有行都将是第一个
      • 最后,.drop_duplicateskeep='first' 将删除 dfc 底部的所有重复项,从而仅保留 df1 中具有正确索引的行。
    import pandas as pd
    
    # concat dataframes
    dfc = pd.concat([df1[df2.columns], df2])
    
    # drop non-duplicate rows and then drop duplicates, but keep the 1st
    df2_correct_indices = dfc[dfc.duplicated(keep=False)].drop_duplicates(keep='first')
    
    # display(df2_correct_indices)
    
        A1   A2   A3   A4
    0  111  555  999  101
    1  222  666  123  202
    2  333  777  456  303
    3  444  888  789  404
    

    使用的样本数据

    df1

    df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321', 'not_in_df2'],
                        'A1': [111, 222, 333, 444, 1000],
                        'A2': [555, 666, 777, 888, 1000],
                        'A3': [999, 123, 456, 789, 1000],
                        'A4': [101, 202, 303, 404, 1000],
                        'QQ': [1.3, 2.5, 3.7, 4.9, 1000]})
    
             Name    A1    A2    A3    A4      QQ
    0     ABC-123   111   555   999   101     1.3
    1     DEF-456   222   666   123   202     2.5
    2     GHI-789   333   777   456   303     3.7
    3     JKL-321   444   888   789   404     4.9
    4  not_in_df2  1000  1000  1000  1000  1000.0
    

    df2

    df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
                        'A2': [888, 666, 555, 777],
                        'A3': [789, 123, 999, 456],
                        'A4': [404, 202, 101, 303]})
    
        A1   A2   A3   A4
    0  444  888  789  404
    1  222  666  123  202
    2  111  555  999  101
    3  333  777  456  303
    

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 2018-12-18
      • 2014-02-04
      • 2019-03-06
      • 2023-01-08
      • 1970-01-01
      • 2013-04-08
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多