【问题标题】:How to get the common index of two pandas dataframes?如何获得两个熊猫数据框的共同索引?
【发布时间】:2018-06-18 15:30:30
【问题描述】:

我有两个 pandas 数据帧 df1 和 df2,我想对它们进行转换,以便它们仅保留两个数据帧共有的索引的值。

df1

                      values 1
0                            
28/11/2000          -0.055276
29/11/2000           0.027427
30/11/2000           0.066009
01/12/2000           0.012749
04/12/2000           0.113892

df2

                       values 2

24/11/2000            -0.004808
27/11/2000            -0.001812
28/11/2000            -0.026316
29/11/2000             0.015222
30/11/2000            -0.024480

成为

df1

                     value 1

28/11/2000          -0.055276
29/11/2000           0.027427
30/11/2000           0.066009

df2

                       value 2

28/11/2000            -0.026316
29/11/2000             0.015222
30/11/2000            -0.024480

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我发现 pd.Index 和设置组合比 numpy.intersect1d 和 df1.index.intersection(df2.index) 快得多。这是我使用的:

    df2 = df2.loc[pd.Index(set(df1.index)&set(df2.index))]

    【讨论】:

      【解决方案2】:

      你可以pd.merge他们用一个中间DataFrame创建另一个DataFrame的索引:

      df2_indexes = pd.DataFrame(index=df2.index)
      df1 = pd.merge(df1, df2_indexes, left_index=True, right_index=True)
      df1_indexes = pd.DataFrame(index=df1.index)
      df2 = pd.merge(df2, df1_indexes, left_index=True, right_index=True)
      

      或者你可以使用pd.eval:

      df2_indexes =  df2.index.values
      df1 = df1[eval("df1.index in df2_indexes"]
      df1_indexes = df1.index.values
      df2 = df2[eval("df2.index in df1_indexes"]
      

      【讨论】:

        【解决方案3】:

        你可以使用Index.intersection + DataFrame.loc:

        idx = df1.index.intersection(df2.index)
        print (idx)
        Index(['28/11/2000', '29/11/2000', '30/11/2000'], dtype='object')
        

        numpy.intersect1d 的替代解决方案:

        idx = np.intersect1d(df1.index, df2.index)
        print (idx)
        ['28/11/2000' '29/11/2000' '30/11/2000']
        

        df1 = df1.loc[idx]
        print (df1)
                    values 1
        28/11/2000 -0.055276
        29/11/2000  0.027427
        30/11/2000  0.066009
        
        df2 = df2.loc[idx]
        

        【讨论】:

        • 我想知道您是否可以使用单级多级索引来做到这一点?
        • 很好的答案。只有一个小错误:df2 = df1.loc[idx] 应该是 df2 = df2.loc[idx]
        【解决方案4】:

        索引对象有一些类似集合的属性,所以你可以简单地取交集,如下所示:

        df1 = df1.reindex[ df1.index & df2.index ]
        

        这将保留交叉点中第一个数据帧的顺序,df

        【讨论】:

          【解决方案5】:

          reindex + dropna

          df1.reindex(df2.index).dropna()
          Out[21]: 
                       values1
          28/11/2000 -0.055276
          29/11/2000  0.027427
          30/11/2000  0.066009
          
          
          df2.reindex(df1.index).dropna()
          Out[22]: 
                       values2
          28/11/2000 -0.026316
          29/11/2000  0.015222
          30/11/2000 -0.024480
          

          【讨论】:

            【解决方案6】:

            并且,使用isinintersection 可能会更快。

            In [286]: df1.loc[df1.index.isin(df2.index)]
            Out[286]:
                         values1
            0
            28/11/2000 -0.055276
            29/11/2000  0.027427
            30/11/2000  0.066009
            
            In [287]: df2.loc[df2.index.isin(df1.index)]
            Out[287]:
                         values2
            0
            28/11/2000 -0.026316
            29/11/2000  0.015222
            30/11/2000 -0.024480
            

            【讨论】:

              【解决方案7】:
              In [352]: common = df1.index.intersection(df2.index)
              
              In [353]: df1.loc[common]
              Out[353]:
                           values1
              0
              28/11/2000 -0.055276
              29/11/2000  0.027427
              30/11/2000  0.066009
              
              In [354]: df2.loc[common]
              Out[354]:
                           values2
              0
              28/11/2000 -0.026316
              29/11/2000  0.015222
              30/11/2000 -0.024480
              

              【讨论】:

                【解决方案8】:

                你有没有尝试过类似的东西

                df1 = df1.loc[[x for x in df1.index if x in df2.index]]
                df2 = df2.loc[[x for x in df2.index if x in df1.index]]
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-10-22
                  • 2018-10-07
                  • 2018-07-10
                  • 2017-10-05
                  • 2017-12-12
                  • 2022-07-10
                  • 1970-01-01
                  • 2021-09-18
                  相关资源
                  最近更新 更多