在熊猫中按一列随机排列行
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 - 如果列表中有多个相同的值,例如3
和 2
,则第二个解决方案有效,然后 reindex
引发错误。因此有必要按cumcount
计算每个值,然后合并 - 列表的第一个重复值与列的第一个重复值。以上是关于在熊猫中按一列随机排列行的主要内容,如果未能解决你的问题,请参考以下文章