【问题标题】:Difference between df.reindex() and df.set_index() methods in pandaspandas 中 df.reindex() 和 df.set_index() 方法的区别
【发布时间】:2018-11-17 08:59:51
【问题描述】:

我对此感到困惑,这很简单,但我没有立即在 StackOverflow 上找到答案:

  • df.set_index('xcol') 使列 'xcol' 成为索引(当它是 df 的列时)。

  • 然而,df.reindex(myList) 从数据框外部获取索引,例如,来自我们在其他地方定义的名为 myList 的列表。

但是,df.reindex(myList) 也会将值更改为 NA。一个简单的替代方法是:df.index = myList

我希望这篇文章能澄清它!也欢迎对这篇文章进行补充!

【问题讨论】:

    标签: python python-3.x pandas indexing reindex


    【解决方案1】:

    除了 Ben 的出色回答。 T,我想再举一个例子,说明当您将reindexset_index 用于索引列时它们有何不同

    import pandas as pd
    import numpy as np
    testdf = pd.DataFrame({'a': [1, 3, 2],'b': [3, 5, 4],'c': [5, 7, 6]})
    
    print(testdf)
    print(testdf.set_index(np.random.permutation(testdf.index)))
    print(testdf.reindex(np.random.permutation(testdf.index)))
    

    输出:

    • 使用set_index,当index列(第一列)被打乱时,其他列的顺序保持不变
    • 使用reindex,行的顺序会根据index 列的随机排列进行相应更改。
       a  b  c
    0  1  3  5
    1  3  5  7
    2  2  4  6
       a  b  c
    1  1  3  5
    2  3  5  7
    0  2  4  6
       a  b  c
    2  2  4  6
    1  3  5  7
    0  1  3  5
    

    【讨论】:

      【解决方案2】:

      只是补充一下,对set_index 的撤消将是reset_index 方法(或多或少):

      df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
      print (df)
      
      df.set_index('a', inplace=True)
      print(df)
      
      df.reset_index(inplace=True, drop=False)
      print(df)
      

         a  b
      0  1  3
      1  2  4
         b
      a   
      1  3
      2  4
         a  b
      0  1  3
      1  2  4
      

      【讨论】:

        【解决方案3】:

        您可以通过一个简单的示例看到不同之处。让我们考虑一下这个数据框:

        df = pd.DataFrame({'a': [1, 2],'b': [3, 4]})
        print (df)
           a  b
        0  1  3
        1  2  4
        

        索引是 0 和 1

        如果您使用 set_index 和列“a”,则索引为 1 和 2。如果您使用 df.set_index('a').loc[1,'b'],您将获得 3。

        现在如果你想使用reindex 与相同的索引1 和2 例如df.reindex([1,2]),当你做df.reindex([1,2]).loc[1,'b'] 时你会得到4.0

        发生的事情是set_index 已将先前的索引 (0,1) 替换为 (1,2)(来自列 'a' 的值),而没有触及列 'b' 中值的顺序

        df.set_index('a')
           b
        a   
        1  3
        2  4
        

        reindex 更改索引但保留“b”列中的值与原始 df 中的索引相关联

        df.reindex(df.a.values).drop('a',1) # equivalent to df.reindex(df.a.values).drop('a',1)
             b
        1  4.0
        2  NaN
        # drop('a',1) is just to not care about column a in my example
        

        最后,reindex 更改索引的顺序而不更改与每个索引关联的行的值,而set_index 将使用列的值更改索引,而不涉及其他值的顺序数据框

        【讨论】:

        • 很好的解释!
        • 只是一个简短的使用注释,pandas 建议使用at 而不是loc 进行单单元格索引:df.at[1, 'b']。 Loc 通常用于访问范围。
        猜你喜欢
        • 2013-11-16
        • 2022-11-15
        • 2019-06-16
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        相关资源
        最近更新 更多