【问题标题】:Random-shuffing python dataframe row between categories类别之间的随机洗牌python数据框行
【发布时间】:2020-01-26 14:43:40
【问题描述】:

我知道 numpy.random.permutation 方法可以方便地打乱数据框中的行。

但是,我希望对一列的行进行混洗,以便在混洗之后,该列的相同值与 a 的相同值相关联 第二列。例如这里:

     sid  tid   cluster_id                   coherence
0    484  367          0   (-0.7602504647007313-0.12366326038519604j)
1    485  367          0   (-0.7602504647007313-0.12366326038519604j)
2    227    2          1   (0.8285282150429198+0.007917196582272277j)
3    228    2          1   (0.8285282150429198+0.007917196582272277j)
4    488  245          2   (-0.5247187752391191+0.03756613687159624j)
5    489  245          2   (-0.5247187752391191+0.03756613687159624j)
6     76  504          3   (-0.5017704895797781-0.17508351848297674j)
7     59  545          3  (-0.37153924345882344-0.08026706090664427j)

我想打乱“连贯性”行的值。

目前,具有相同 tid 的行也具有相同的一致性值。 这也应该在改组之后保留 - 但应该将一致性值分配给新的 tids。

因此,先前与 tid X 相关联的一致性值将是 与新的 tid Y 相关联,但具有此新 tid Y 的所有行都应具有相同的一致性值。

【问题讨论】:

  • 如果你打乱整行,连贯性和tid应该粘在一起。
  • 它们应该被洗牌——它们不应该粘在一起。但是连贯性值对于分配给它们的新 tid 应该是一致的
  • 你能让数据框易于复制吗?
  • 我建议你在发布更多问题之前阅读minimal reproducible example,没有你想要什么的例子,“你已经尝试过”,如果有的话,甚至没有足够的代码来重新创建你的数据框.

标签: python dataframe


【解决方案1】:

由于我懒得复制你的数据框,我只用了一个玩具箱。您想要的是在 groupby 中随机播放:

df = pd.DataFrame({'tid':[1,1,1,2,2,2],'others':[1,2,3,4,5,6],'coherence':[1,2,3,4,5,6]})
df['coherence'] = df.groupby('tid').coherence.transform(np.random.permutation)

更新

好的,所以我第一次理解错了,上一个答案在 tid 的每个组中随机播放,但您想随机分组。仍然groupby 是解决方案,只需先将组洗牌:

import random
df = pd.DataFrame({'tid':[1,1,2,2,3,3,4,4],'val':[1,2,3,4,5,6,7,8],'coherence':[1,1,2,2,3,3,4,4]})
groups = [df for _, df in df[['tid','coherence']].groupby('tid')]
random.shuffle(groups)
df[['tid', 'coherence']] = pd.concat(groups).reset_index(drop=True)

我希望这样做。

更新

您的问题根本不清楚您想要什么,也许您应该更好地改写它,然后您继续投票并否决已尝试帮助您两次的唯一答案。这是您的解决方案:

df = pd.DataFrame({'tid':[1,1,2,2,3,3,4,4],'val':[1,2,3,4,5,6,7,8],'coherence':[1,1,2,2,3,3,4,4]})
tmp = df[['tid', 'coherence']].drop_duplicates()
tmp['coherence'] = np.random.permutation(tmp.coherence)
pd.merge(df, tmp, 'left', left_on='tid', right_on='tid')

coherence_x 是旧的,coherence_y 是新的。

【讨论】:

  • @Pegah 让我先确定我明白你想要什么。您希望在每个tid 中,只有coherence 列被改组,对吗?因此,如果我的示例中的coherence 1 到 3 与tid==1 相关联,但经过改组后,它们不再与之前的others 相关联。这不是你想要的吗?
  • 嗨 - 不,连贯性值应该在 tid 之间打乱。假设我们有一个与 tid1 相关的相干性值为 5。改组后,连贯性值将与 tid24 相关联,但所有具有 tid24 的行现在的连贯性值为 5
  • @Pegah:那么与 tid 的一致性是 1 对 1 的对应关系?
  • 现在 tid 和 coherence 之间仍然没有洗牌。所以 tid 1 即使在改组之后也具有相同的相干性值,这是不正确的。 Tid 1 具有一致性 1,但在洗牌后应该随机分配一个新的一致性值。但是所有 tid = 1 的行都应该被赋予这个(新的)一致性值。
猜你喜欢
  • 2017-10-15
  • 2018-11-19
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多