【问题标题】:pandas: assign random numbers in given range to equal column valuespandas:将给定范围内的随机数分配给相等的列值
【发布时间】:2018-08-07 20:41:48
【问题描述】:

我正在处理一个大型数据集,其中一列有很长的整数,如下所示:

       Column_1        Column_2
  1     A              12345123451
  2     B              12345123451
  3     C              12345123451
  4     D              23456789234
  5     E              23456789234
  6     F              34567893456

这里重要的不是 Column_2 中的实际数字,而是当这些数字相同而 Column_1 不同时。我想从一系列较小的数字(例如 (1, 999))中随机重新分配 Column_2 的值。

       Column_1        Column_2
  1     A              120
  2     B              120
  3     C              120
  4     D              54
  5     E              54
  6     F              567

我的问题是想办法在 lambda 函数中描述 Column_2 中每个相等的值都需要相同的随机数。

【问题讨论】:

  • 在我看来 OP 只关心 'Column_2'。如果'Column_1'是一样的,我怀疑是没有轴承的。

标签: python pandas dataframe random


【解决方案1】:

您可以使用 np.random.choice 创建一个介于 1 和 999 之间的随机数数组,确保输入 replace=False 这样您就不会得到任何重复,然后将 Column_2 映射到 Column_2 的字典映射您的随机数数组的唯一值:

import numpy as np 

nums = np.random.choice(range(1,999), size = df['Column_2'].nunique(), replace=False)

# If you prefer to use the random package rather than numpy, uncomment the following:
# import random
# nums = random.sample(range(1,999), df['Column_2'].nunique())

df['Column_2'] = df['Column_2'].map(dict(zip(df['Column_2'].unique(), nums)))

>>> df
  Column_1  Column_2
1        A       274
2        B       274
3        C       274
4        D       842
5        E       842
6        F       860

说明:

您的数字数组如下所示:

>>> nums
array([274, 842, 860])

你的映射字典看起来像:

>>> dict(zip(df['Column_2'].unique(), nums))
{12345123451: 274, 23456789234: 842, 34567893456: 860}

所以当你映射时,你是说用274替换12345123451,用842替换23456789234,等等......

【讨论】:

  • 让我再问一个问题:这些随机数不可能相同吧?如果您动态生成随机数,您可能会为不同的组获得相同的数字
  • 这就是replace=False 的用途。当您将np.random.choice 与该参数一起使用时,它将确保没有重复项。与random.sample 相同(默认)
  • 太棒了:}没看到replace=False+1
【解决方案2】:

从replace=False 上的 sacul 获得提示(更新答案)

使用pandas.factorize 和numpy.random

i, r = pd.factorize(df.Column_2)
choices = np.arange(max(999, r.size))
c = np.random.choice(choices, r.shape, False)

df.assign(Column_2=c[i])

  Column_1  Column_2
1        A       812
2        B       812
3        C       812
4        D       751
5        E       751
6        F       574

【讨论】:

  • 由于看起来 OP 实际上并不关心 Column_2 的值,我猜他们可以选择只实际使用 df['Column_2'] = pd.factorize(df.Column_2)[0],并让它最终成为 @987654327 @... 不是随机的,但如果目标只是为每个类别设置不同的类别,它会起作用。无论如何,我喜欢你的方法!
  • 确实如此。我们会看看 OP 是否真的想要随机的 ¯\_(ツ)_/¯
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
相关资源
最近更新 更多