在熊猫中按一列随机排列行

Posted

技术标签:

【中文标题】在熊猫中按一列随机排列行【英文标题】: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

【问题讨论】:

【参考方案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 计算每个值,然后合并 - 列表的第一个重复值与列的第一个重复值。

以上是关于在熊猫中按一列随机排列行的主要内容,如果未能解决你的问题,请参考以下文章

我需要以相同的随机方式随机打乱两个熊猫数据帧的行

如何在 Firebase 中按降序排列数据 - Python

dplyr:在 R 中按字母顺序排列列

按一列两行分组

如何按一列的最大值获取SQL行,按另一列分组

在熊猫数据框中按行应用时如何保留数据类型?