如何编写函数生成指定均匀分布y值并与x整合为DataFrame?
问题分析与解决方案
咱们先聊聊你写的函数为啥只返回最后一组值——在colm的循环里,你每次都用i = np.random.uniform(...)把之前的i给覆盖了,循环跑完后,i自然就只剩最后一次循环生成的那组数据,根本没把5组数据都收集起来。另外,你函数里写的“每次范围加10”的逻辑,和你最初代码里y1到y5的实际随机范围也不一样,这点得注意哦。
下面给你两种解决方案,对应不同的需求:
方案1:严格匹配你原始代码的随机数范围
如果你想完全复刻最开始的逻辑,生成指定范围的5组随机数,这个函数可以直接用:
import numpy as np import pandas as pd def generate_data(): # 生成x:0到49的DataFrame x = pd.DataFrame({'x': np.arange(0, 50)}) # 按照你最初的定义生成5组随机数 y1 = np.random.uniform(10, 15, 10) y2 = np.random.uniform(20, 25, 10) y3 = np.random.uniform(0, 5, 10) y4 = np.random.uniform(30, 32, 10) y5 = np.random.uniform(13, 17, 10) # 把所有y组拼起来,转成Pandas Series y = pd.Series(np.concatenate((y1, y2, y3, y4, y5)), name='y') # 两种返回选项,按需选一种: # 选项1:分别返回x(DataFrame)和y(Series) return x, y # 选项2:返回合并了x和y的DataFrame # return pd.concat([x, y], axis=1)
用的时候很简单:
# 拿到单独的x和y x_df, y_series = generate_data() # 或者直接拿合并后的DataFrame # combined_df = generate_data()
方案2:循环生成递增范围的随机数(对应你写的colm函数思路)
如果你的初衷是想用循环生成每组范围递增的随机数(比如第一组10-15,第二组20-25,以此类推),那可以改成下面这样,用列表来收集每一组的数据:
import numpy as np import pandas as pd def generate_data_with_increasing_ranges(start_s=10, start_t=15, num_groups=5, samples_per_group=10): # 生成x,长度等于组数×每组样本数 x = pd.DataFrame({'x': np.arange(0, num_groups * samples_per_group)}) # 用列表存每一组的随机数 y_groups = [] s, t = start_s, start_t for _ in range(num_groups): # 生成当前组的随机数 group = np.random.uniform(s, t, samples_per_group) y_groups.append(group) # 更新下一组的范围 s += 10 t += 10 # 把所有组拼起来转成Series y = pd.Series(np.concatenate(y_groups), name='y') # 同样可以选择返回x和y,或者合并后的DataFrame return x, y
使用示例:
# 生成5组,每组10个,范围依次是10-15、20-25、30-35、40-45、50-55 x_df, y_series = generate_data_with_increasing_ranges()
总结一下,你原来的函数问题就出在没有收集所有组的数据,只是一次次覆盖变量,用列表把每一组存起来再拼接,就能得到完整的y值啦。
内容的提问来源于stack exchange,提问作者Nikhil Mangire
相关产品推荐
相关产品推荐

