[英]Generating defined amount of the rows based on max/min of other Dataframe in pandas
[英]Generating n amount new rows on a pandas dataframe based off values given in other columns
因此,我有以下示例 dataframe (为了清晰/简单起见,仅包含一行):
df = pd.DataFrame({'base_number': [2],
'std_dev': [1]})
df['amount_needed'] = 5
df['upper_bound'] = df['base_number'] + df['std_dev']
df['lower_bound'] = df['base_number'] - df['std_dev']
对于每个给定的行,我想生成行数,使得每行的总数是df['amount_needed']
给出的数字(在本例中为 5)。 我希望这 5 个新行分布在df['upper_bound']
和df['lower_bound']
给出的频谱中。 因此,对于上面的示例,我希望得到以下结果作为 output:
df_new = pd.DataFrame({'base_number': [1, 1.5, 2, 2.5, 3]})
当然,这个过程将针对更大的 dataframe 中的所有行完成,以及与这个特定问题无关的许多其他列,这就是为什么我试图找到一种方法来自动化这个过程。
一行df
将创建一个系列(或一个数据框)。 这是迭代df
并使用您指定的值创建系列的一种方法:
for row in df.itertuples():
arr = np.linspace(row.lower_bound,
row.upper_bound,
row.amount_needed)
s = pd.Series(arr).rename('base_number')
print(s)
0 1.0
1 1.5
2 2.0
3 2.5
4 3.0
Name: base_number, dtype: float64
最终使用 jsmart 的贡献并对其进行处理以生成新的 dataframe,保留原始 id 以便根据需要根据 id 将旧列中的其他列合并到新列中(整个过程如下所示):
amount_needed = 5
df = pd.DataFrame({'base_number': [2, 4, 8, 0],
'std_dev': [1, 2, 3, 0]})
df['amount_needed'] = amount_needed
df['upper_bound'] = df['base_number'] + df['std_dev']
df['lower_bound'] = df['base_number'] - df['std_dev']
s1 = pd.Series([],dtype = int)
for row in df.itertuples():
arr = np.linspace(row.lower_bound,
row.upper_bound,
row.amount_needed)
s = pd.Series(arr).rename('base_number')
s1 = pd.concat([s1, s])
df_new = pd.DataFrame({'base_number': s1})
ids_og = list(range(1, len(df) + 1))
ids_og = [ids_og] * amount_needed
ids_og = sorted(list(itertools.chain.from_iterable(ids_og)))
df_new['id'] = ids_og
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.