代码之家  ›  专栏  ›  技术社区  ›  ipramusinto

按列洗牌

  •  2
  • ipramusinto  · 技术社区  · 6 年前

    下面是dataframe的例子。

        c1     c2
    0   1       a
    1   2       b
    2   3       c
    3   4       d
    4   5       e
    

    给定一个模板 c1 = [3, 2, 5, 4, 1] ,我想根据列的新顺序更改行的顺序 c1 ,所以它看起来像:

        c1     c2
    0    3      c
    1    2      b
    2    5      e
    3    4      d
    4    1      a
    

    我找到了下面的线索,但是随机的。Cmmiw公司。

    Shuffle DataFrame rows

    2 回复  |  直到 6 年前
        1
  •  5
  •   jezrael    6 年前

    如果值在列表和 c1 列使用 reindex

    df = df.set_index('c1').reindex(c1).reset_index()
    print (df)
       c1 c2
    0   3  c
    1   2  b
    2   5  e
    3   4  d
    4   1  a
    

    使用列表和列中的重复项的一般解决方案:

    c1 = [3, 2, 5, 4, 1, 3, 2, 3]
    
    #create df from list 
    list_df = pd.DataFrame({'c1':c1})
    print (list_df)
       c1
    0   3
    1   2
    2   5
    3   4
    4   1
    5   3
    6   2
    7   3
    
    #helper column for count duplicates values
    df['g'] = df.groupby('c1').cumcount()
    list_df['g'] = list_df.groupby('c1').cumcount()
    
    #merge together, create index from column and remove g column
    df = list_df.merge(df).drop('g', axis=1)
    print (df)
       c1 c2
    0   3  c
    1   2  b
    2   5  e
    3   4  d
    4   1  a
    5   3  c
    
        2
  •  3
  •   piRSquared    6 年前

    merge

    合并 .
    这种方法的一个优点是,它可以优雅地处理任意一种类型的重复项 df.c1 还是名单 c1

    d1 = pd.DataFrame({'c1': c1})
    
    d1.merge(df)
    
       c1 c2
    0   3  c
    1   2  b
    2   5  e
    3   4  d
    4   1  a
    

    searchsorted

    这是不太健全,但将工作,如果 测向c1 是:

    • 一对一映射

    df.iloc[df.c1.searchsorted(c1)]
    
       c1 c2
    2   3  c
    1   2  b
    4   5  e
    3   4  d
    0   1  a