在熊猫中按列随机排列行

时间:2018-09-10 13:26:45

标签: python pandas

我有以下数据框示例。

    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

2 个答案:

答案 0 :(得分:5)

如果值在列表中以及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

答案 1 :(得分:3)

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
相关问题