【问题标题】:looping through dataframe and generating random dataframe循环遍历数据帧并生成随机数据帧
【发布时间】:2018-11-13 18:36:58
【问题描述】:

我有一个如下的查找数据框:

            String   Length
0            A       2
1            B       4
2            C       3
3            D       2

我有一个输入数据框如下:

   Input
0  A20
1  B1611
2  C001
3  D18

我想得到如下输出:

      Output
    0  C300
    1  B2718
    2  C421
    3  A17

其中B2718 是 B 与随机值 2718 连接的 4 位整数,长度 4 是从查找的“长度”列中获得的。

我写了以下代码:

def random_with_N_digits(n):
    range_start = 10**(n-1)
    range_end = (10**n)-1
    return randint(range_start, range_end)

def r_funct(lookup):
r_list = []
for index, row in lookup.iterrows():
    r_int= random_with_N_digits(row.Length)
    r_str=row.String+str(r_int)
    r_list.append(r_str)
return r_list
out_df = r_funct(lookup)
out_df = pd.DataFrame(out_df, columns=['Output'])
out_df = out_df.sample(n=in_df.size)
print(out_df)

但我无法在每次运行时获得相同的输出数据帧 (out_df)。

请提出建议。

【问题讨论】:

  • 您的规则没有明确定义。为什么将 A20 和 D18 分别转换为 C300 和 A17,而不是 A73 和 D29?
  • @Mr.T 我希望输出数据帧是随机顺序
  • 但是您的样本输入不应该是“A12 B2345 C345 C456”吗?目前,它既没有连接到查找也没有连接到输入。还不清楚。

标签: python python-3.x pandas random series


【解决方案1】:

这是将np.random.randintpd.Series.apply 结合使用的一种方式。

注意我假设没有重新排序,这似乎是您想要的输出所暗示的。

np.random.seed(0)

def random_num(i):
    return str(np.random.randint(10**(i-1), 10**i))

df['Value'] = df['String'] + df['Length'].apply(random_num)

print(df)

  String  Length  Value
0      A       2    A42
1      B       4  B3708
2      C       3   C906
3      D       2    D13

【讨论】:

  • 我也在寻找重新排序。这就是我挣扎的地方。不希望按 A-B-C-D 顺序输出。
  • 你能解释一下所需的排序逻辑吗?
  • 需要随机。没有固定的逻辑。但是,对于每个输入值“A20”,如果输出为“B2134”,那么即使重新运行代码,它也应该始终为“B2134”。 PS:我已经更新了相关代码。
  • 好的,所以添加np.random.seed(0)(根据更新),当您重新运行时,您的随机性是“一致的”。您可以根据现有代码使用sample 作为最后一步。
猜你喜欢
  • 2021-12-15
  • 2020-11-21
  • 2021-11-22
  • 2017-12-14
  • 1970-01-01
  • 2021-05-16
  • 2017-03-01
  • 2017-10-27
相关资源
最近更新 更多