【问题标题】:Shuffle rows by a column in pandas在熊猫中按一列随机排列行
【发布时间】:2019-02-14 22:49:13
【问题描述】:

我有以下数据框示例。

    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

我找到了以下线程,但随机播放是随机的。嗯嗯。

Shuffle DataFrame rows

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    merge

    您可以创建一个数据框,其中包含按所需顺序指定的列,然后是 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

    这不太健壮,但如果df.c1 是:

    • 已排序
    • 一对一映射

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

    【讨论】:

      【解决方案2】:

      如果值在列表和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
      

      【讨论】:

      • 具有唯一价值的列表是我的情况。完美的解决方案。谢谢!但是我仍然不明白第二种情况。为什么结果有第 5 个索引? @jezrael
      • @bakka - 如果列表中有多个相同的值,例如 32,则第二个解决方案有效,然后 reindex 引发错误。因此有必要按cumcount 计算每个值,然后合并 - 列表的第一个重复值与列的第一个重复值。
      猜你喜欢
      • 2016-03-24
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多